見出し画像

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にするのを忘れないようにしましょう。

テンプレートを作成します
Dockerhubにpushしたイメージを指定します。TempleteTypeをServerlessにしましょう。

あとは前回と同じようにテンプレートをデプロイしましょう。

Serverlessの所からNew Endpointを選択
先ほど作成したテンプレートを指定

結果、以下のようにエンドポイントが作成されました。

デプロイ後の画面

モデルの利用

モデルを利用する場合、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を使いモデルの作成、デプロイ、呼び出しまでをやってみました。今回はサンプルのため簡易的なモデルでしたが、次回は実際のモデルを利用していく予定です。

この記事が気に入ったらサポートをしてみませんか?