RunPodを使った独自モデルでのサーバレスGPU推論
概要
前回、RunpodというサーバレスでGPUを利用したAPIを作るサービスがあり、とりあえずRunPodが提供しているサンプルのモデルを使ってみました。サンプルのモデルで出来ることには限りがあるので、独自のモデルを使いたくなります。そこで自分の独自モデルをデプロイする試みをやってみましょう。今回は、特にGPUを使わないサンプル的なモデルを利用していきましょう。
モデルの作成
簡単な質問応答の仕組みのサンプルを作ってみましょう。JSON形式でqueryを受け付け、JSON形式で回答が返すものとします。なお、今回は回答はNot implementedと固定メッセージとします。Runpodでは、DockerHubにイメージを置いて、それをデプロイするという流れになります。まずは、Dockerfileを作成しましょう。イメージ内にはhandler.pyのみを入れておきます。
from python:3.11.1-buster
WORKDIR /
RUN pip install runpod
ADD handler.py .
CMD [ "python", "-u", "/handler.py" ]
handler.pyは以下のようにしました。handlerがエントリポイントになっており、eventにユーザからの入力が入ります。
#!/usr/bin/env python
import runpod
def handler(event):
event_input = event["input"]
query = event_input["query"]
ret = {
"query": query,
"answer": "Not implemented"
}
return ret
runpod.serverless.start({"handler": handler})
モデルのデプロイ
作成したコードをビルドし、DockerHubにpushし、Runpodにデプロイしていきます。まずはコードをビルドします。
docker build -t runpod_hello_world .
なお、シリコンMacを利用している場合、Runpodとは異なるアーキテクチャになっており、上記のようにビルドするのでは動きません。以下のようにアーキテクチャを指定してあげましょう。
docker buildx build --platform=linux/amd64 -t runpod_hello_world .
あとは、DockerHubにpushしましょう。自身のリポジトリ名を利用してください。
docker login
docker tag runpod_hello_world [repo_name]/runpod_hello_world:1.0.0
docker push [repo_name]/runpod_hello_world:1.0.0
続いてRunpodのサービス上でテンプレートを作ります。注意点として、TempleteTypeをServerlessにするのを忘れないようにしましょう。
あとは前回と同じようにテンプレートをデプロイしましょう。
結果、以下のようにエンドポイントが作成されました。
モデルの利用
モデルを利用する場合、runpodのライブラリを利用する方法と、直接エンドポイントを叩く方法があります。前回はrunpodのライブラリを利用したので、今回は直接エンドポイントを叩く方法についても紹介します。
まずはライブラリを利用した例を以下に示します。
import runpod
runpod.api_key = "<API Key>"
endpoint_id = "<Endpoint ID>"
endpoint = runpod.Endpoint(endpoint_id)
run_request = endpoint.run_sync(
{"query": "Who am I?"}
)
print(run_request)
実行結果は以下のようになります。正しく返ってきていることが確認できます。
{'answer': 'Not implemented', 'query': 'Who am I?'}
続いて、requestsライブラリを使ってみましょう。
import requests
endpoint_id = "<Endpoint ID>"
url = f"https://api.runpod.ai/v2/{endpoint_id}/runsync"
request = {
'input': {'query': 'Who am I?'}
}
headers = {
"Authorization": f"Bearer <API Key>"
}
response = requests.post(url, json=request, headers = headers)
data = response.json()
print(data)
結果は以下のようになりました。こちらは色々な情報が返ってくるみたいですね。
{
'delayTime': 3633, 'executionTime': 48,
'id': 'sync-e2ddec56-33e0-4c10-a15c-62983521e850-e1',
'output': {'answer': 'Not implemented', 'query': 'Who am I?'},
'status': 'COMPLETED'
}
まとめ
今回は、独自のカスタムモデルでRunpodを使いモデルの作成、デプロイ、呼び出しまでをやってみました。今回はサンプルのため簡易的なモデルでしたが、次回は実際のモデルを利用していく予定です。
この記事が気に入ったらサポートをしてみませんか?