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
40
FastAPIを利用して作る簡易推論API
bobfromjapan
October 05, 2024
Tweet
Share
More Decks by bobfromjapan
See All by bobfromjapan
Transformer系機械学習モデルを取り巻くライブラリや用語を整理する
bobfromjapan
2
730
鯖落ちパーツで安価に機械学習用マシンを作ってみる
bobfromjapan
0
620
Featured
See All Featured
How to Ace a Technical Interview
jacobian
276
23k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
670
Adopting Sorbet at Scale
ufuk
75
9.2k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Pragmatic Product Professional
lauravandoore
32
6.4k
A Tale of Four Properties
chriscoyier
158
23k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
13
1k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
A better future with KSS
kneath
238
17k
Faster Mobile Websites
deanohume
306
31k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
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にジョブ登録する荒業もあり
かも(ベストだとは思っていない) • 他のおすすめ方法があれば教えてください まとめ