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
600
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
99
18k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Being A Developer After 40
akosma
89
590k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Navigating Team Friction
lara
183
15k
How to Ace a Technical Interview
jacobian
276
23k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
BBQ
matthewcrist
86
9.5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
29
4.6k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
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にジョブ登録する荒業もあり
かも(ベストだとは思っていない) • 他のおすすめ方法があれば教えてください まとめ