Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FastAPIを利用して作る簡易推論API

bobfromjapan
October 05, 2024
38

 FastAPIを利用して作る簡易推論API

bobfromjapan

October 05, 2024
Tweet

Transcript

  1. 3 最近のKaggle戦歴 • AI Math Olympiad Prize 1 – LLMを使って数学の問題を解くシステムを作る

    • ISIC 2024 – 3Dボディスキャンから切り出されたほくろの画像のメラノーマ診断を行うモデルを作る • 興味がある人が居れば後でお話しましょう!
  2. 5 • シンプル・高速なPythonのWebフレームワーク • 直感的に少ないコードでWeb APIを作成可能 • Pydantic※による型定義を基にした入力値検証やOpenAPI※※形式の ドキュメントの自動生成が行える等、堅牢なAPIを簡単に構築できる ※

    Pydantic: バリデーション機能を含めたデータ構造の定義を行えるPython ライブラリ。PythonでWeb API開発やデータベースとの連携を行う際に使う ※※ OpenAPI: REST APIの仕様を記述するための標準フォーマット FastAPIとは
  3. 6 • 単純にアクセスしたらメッセージが返ってくるAPI – Google CloudのCloud Runでデプロイしたもの: リンク シンプルな例 http://localhost:8000/docs

    にアクセスしてOpenAPI形式のAPIリファレンスを確認 できる `python app.py`でサーバー起動 →クエリパラメータでdataを入力して、ブラウザでアクセス app.py
  4. 7 • できること、書き方は似ているのでどっちを使っても良い • 検証用途で少人数にAPIを提供する場合パフォーマンスは重視しない ➢ 型定義と自動ドキュメント生成がデフォルトで行われるのでFastAPIを使っています – 「APIの詳細は/docs見てね!」で済むのが良い FastAPIとFlask

    機能 FastAPI Flask 理由 パフォーマンス 高速 比較的低速 FastAPIは非同期処理に対応したASGIフレームワークであ るため、Flask(WSGI)よりもパフォーマンスが高い 学習コスト 低い 比較的高い FastAPIは直感的なAPI設計と豊富なドキュメントがあり、 Flaskよりも学習が容易 型ヒント 必須 オプション FastAPIは型ヒントを必須とすることで、堅牢なAPI開発と自 動ドキュメント生成が可能。 自動ドキュメント生成 あり 拡張機能が必要 FastAPIはOpenAPI形式のドキュメントを自動生成するため、 APIの共有やテストが容易。 非同期処理 対応 拡張機能が必要 FastAPIは標準で非同期処理に対応しており、高負荷な処 理でも効率的に対応可能。
  5. 8 • リクエストボディのデータ構造を定義…… • あとは処理を普通のPython関数として書くだけ…… 推論APIの設計方法 > curl http://localhost:8000/chat -X

    "GET" -H "Content-Type: application/json" -H "accept: application/json" -d "{¥"temperature¥": 0.9, ¥"message¥": ¥"Hello! How are you?¥"}" {"message":"User: Hello! How are you?¥nAssistant: *I am a bot, and this"} 例: 30行で書くテキスト生成API
  6. 12 • バックエンドのAPIに加え、簡単なフロントエンドをGradioで作ってみてGoogle CloudのCloud Runでデプロイした例 – バックエンド: https://mishima-fastapi-sample-2-178859831790.asia- northeast1.run.app/docs –

    フロントエンド: https://mishima-fastapi-sample-3-178859831790.asia- northeast1.run.app/ • 9割ChatGPTのo1-previewに作らせた: チャットログ • ソースコードはこちら: – https://github.com/bobfromjapan/mishima-fastapi-samples 事例1 REINVENT4
  7. 14 • 入力としてアミノ酸、核酸配列と低分子化合物をyaml内にパスとして書いて推 論が行われる • BASE64エンコーディングしたFASTA, smi, sdfファイルをクライアントから送り付 け、サーバー側でデコードして適切な場所に配置するという雑な方法で処理 事例2

    RoseTTAFold-All-Atom クライアント側の処理 https://github.com/baker-laboratory/RoseTTAFold-All- Atom/blob/main/rf2aa/config/inference/nucleic_acid.yaml クライアント側において あるFASTAファイルをバ イナリとして読み込み それをJSON内でBASE64 エンコーディングして文 字列として埋め込み FastAPIサーバー側ではこ れのデコード、ファイルと しての書き込み処理を実 装
  8. 15 • RoseTTAFold-All-Atomの推論実行 • POSTで受け取った情報からコンフィグファイルを 作成 • Slurm用のジョブテンプレートを作成し、コンフィ グファイルを指定してジョブ発行→ジョブ番号を 返却

    – ジョブテンプレートは次の記事を参考にしました – RoseTTAFold All-Atom環境構築 事例2 RoseTTAFold-All-Atom ジョブテンプレートの例 subprocessを使ってsbatchで上記ジョブテンプ レートを実行、標準出力からジョブ番号を取得
  9. 16 • ジョブの進捗を確認できるGETメソッド – AWS samplesにあった`sacct`コマンドのパーサーを参考に実装 – https://github.com/aws-samples/alphafold-protein-structure-prediction-with-frontend- app/blob/main/provisioning/hpc/alphafold2/scripts/job_get.py •

    処理が終わっている場合PDBファイルをダウンロードするGETメソッド – PDBファイルのみか、 MSAの結果も含むディレクトリを全部ダウンロードするかをオプション で制御 事例2 RoseTTAFold-All-Atom