Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
FastAPIを利用して作る簡易推論API
Search
bobfromjapan
October 05, 2024
0
37
FastAPIを利用して作る簡易推論API
bobfromjapan
October 05, 2024
Tweet
Share
More Decks by bobfromjapan
See All by bobfromjapan
Transformer系機械学習モデルを取り巻くライブラリや用語を整理する
bobfromjapan
2
680
鯖落ちパーツで安価に機械学習用マシンを作ってみる
bobfromjapan
0
540
Featured
See All Featured
Fireside Chat
paigeccino
34
3k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Being A Developer After 40
akosma
87
590k
What's in a price? How to price your products and services
michaelherold
243
12k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
430
How STYLIGHT went responsive
nonsquared
95
5.2k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Six Lessons from altMBA
skipperchong
27
3.5k
Done Done
chrislema
181
16k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Transcript
1 1 FastAPIを利用して作る簡易推論API mishima.syk #21 @bobfromjapan
2 • デモに関しては10月いっぱい目途に停止予定です • ソースコードは公開しておりますので、試したい方はこちらから: – https://github.com/bobfromjapan/mishima-fastapi-samples おことわり
3 最近のKaggle戦歴 • AI Math Olympiad Prize 1 – LLMを使って数学の問題を解くシステムを作る
• ISIC 2024 – 3Dボディスキャンから切り出されたほくろの画像のメラノーマ診断を行うモデルを作る • 興味がある人が居れば後でお話しましょう!
4 • 続々と出てくるOSSのML系ツールをどうやっていろんな人に触ってもらうか? – 環境構築が面倒 – 大概の場合GPUが必要で社用PCでは動かない • REST APIを作ってSMILESとかFASTAを投げるだけでREINVENT4や
RoseTTAFold-All-Atomを使ってもらいたい! ➢ FastAPIを利用した簡易推論サーバーを作ってみた モチベーション
5 • シンプル・高速なPythonのWebフレームワーク • 直感的に少ないコードでWeb APIを作成可能 • Pydantic※による型定義を基にした入力値検証やOpenAPI※※形式の ドキュメントの自動生成が行える等、堅牢なAPIを簡単に構築できる ※
Pydantic: バリデーション機能を含めたデータ構造の定義を行えるPython ライブラリ。PythonでWeb API開発やデータベースとの連携を行う際に使う ※※ OpenAPI: REST APIの仕様を記述するための標準フォーマット FastAPIとは
6 • 単純にアクセスしたらメッセージが返ってくるAPI – Google CloudのCloud Runでデプロイしたもの: リンク シンプルな例 http://localhost:8000/docs
にアクセスしてOpenAPI形式のAPIリファレンスを確認 できる `python app.py`でサーバー起動 →クエリパラメータでdataを入力して、ブラウザでアクセス app.py
7 • できること、書き方は似ているのでどっちを使っても良い • 検証用途で少人数にAPIを提供する場合パフォーマンスは重視しない ➢ 型定義と自動ドキュメント生成がデフォルトで行われるのでFastAPIを使っています – 「APIの詳細は/docs見てね!」で済むのが良い FastAPIとFlask
機能 FastAPI Flask 理由 パフォーマンス 高速 比較的低速 FastAPIは非同期処理に対応したASGIフレームワークであ るため、Flask(WSGI)よりもパフォーマンスが高い 学習コスト 低い 比較的高い FastAPIは直感的なAPI設計と豊富なドキュメントがあり、 Flaskよりも学習が容易 型ヒント 必須 オプション FastAPIは型ヒントを必須とすることで、堅牢なAPI開発と自 動ドキュメント生成が可能。 自動ドキュメント生成 あり 拡張機能が必要 FastAPIはOpenAPI形式のドキュメントを自動生成するため、 APIの共有やテストが容易。 非同期処理 対応 拡張機能が必要 FastAPIは標準で非同期処理に対応しており、高負荷な処 理でも効率的に対応可能。
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
9 • 化合物生成モデルREINVENT4 – https://github.com/MolecularAI/REINVENT4 • 4パターンの生成方法があり、Input Structureが必要なものもある • SMILESも受け付けられるようにして、REINVENT4で生成された化合物
を送り返すAPIを作りたい 事例1 REINVENT4 https://doi.org/10.1186/s13321-024-00812-5 Fig4
10 • REINVENT4はSampling条件をjsonファ イルで指定して化合物生成を行う • これと同じようにデータ型を定義して、公式の 生成コードを関数化したものを作成 事例1 REINVENT4 https://github.com/MolecularAI/REINVENT4/blob/main/configs/json/sampling.json
11 • CURLでde novo生成する場合、こんな感じでリクエストを投げる – 生成された化合物のSMILESと基になったSMILES、それらのタニモト係数、NLLと いった出力を含むJsonのリストを得ることができる 事例1 REINVENT4
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
13 • FASTA形式の文字列+化合物のSMILES等を受け付けて立体構造予測 した結果を返すAPIを作りたい • 処理が重くリソース管理が必要なため、Slurmを利用したジョブ管理を行う 事例2 RoseTTAFold-All-Atom https://github.com/baker-laboratory/RoseTTAFold-All-Atom •
色んなInputがあり得る • MSA用のデータベースなどが必要で環境構築が大変
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サーバー側ではこ れのデコード、ファイルと しての書き込み処理を実 装
15 • RoseTTAFold-All-Atomの推論実行 • POSTで受け取った情報からコンフィグファイルを 作成 • Slurm用のジョブテンプレートを作成し、コンフィ グファイルを指定してジョブ発行→ジョブ番号を 返却
– ジョブテンプレートは次の記事を参考にしました – RoseTTAFold All-Atom環境構築 事例2 RoseTTAFold-All-Atom ジョブテンプレートの例 subprocessを使ってsbatchで上記ジョブテンプ レートを実行、標準出力からジョブ番号を取得
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
17 • 適当なOSSが出てきたときに、他の人に簡単に使ってもらう際に便利かも – ローカルで動く環境が準備できてしまえば、半日もあれば準備できる • Cloud Runとの組み合わせがとても便利です • リソース管理が必要な場合、API経由でSlurmにジョブ登録する荒業もあり
かも(ベストだとは思っていない) • 他のおすすめ方法があれば教えてください まとめ