準備項目 | 説明 |
Tencent Cloudアカウント | 本人確認が完了しているTencent Cloudのアカウント |
企業版プラン | EdgeOne Enterprise Editionプランを購入済みです。 |
Docker環境 | ローカル環境にDocker(推奨バージョン:Docker 20.10以上)がインストール済みで、イメージのビルドとプッシュに使用します。 |
Tencent Cloud TCR(TCR) | Tencent Cloud TCR(個人版で可)を有効にしており、カスタムイメージの保存に使用します。 |
GPUサーバー(オプション) | ローカル環境でイメージの実行をテストする場合は、NVIDIA GPUを搭載したマシンが必要です。ビルドのみを行う場合は不要です。 |
mkdir llama3-edge-inference && cd llama3-edge-inference
Dockerfileファイルを作成します。以下の例では、推論フレームワークとしてvLLMを使用し、ModelScopeからLlama-3.2-3B-Instructモデルをダウンロードします:# ============================================================# Dockerfile for Llama3.2-3B Model with vLLM 0.6.3.post1# ============================================================vLLM公式OpenAI互換イメージをベースイメージとして使用します。FROM vllm/vllm-openai:v0.6.3.post1環境変数を設定し、HuggingFace Hubのオンライン検証をスキップします(オフラインモード)。ENV HF_HUB_OFFLINE=1ENV HF_HOME=/data/modelsENV TRANSFORMERS_CACHE=/data/modelsmodelscopeをインストールしてモデルをダウンロードします(国内ミラーソースを使用して高速化)。RUN pip3 install --no-cache-dir modelscope -i https://pypi.tuna.tsinghua.edu.cn/simpleモデルディレクトリを作成し、モデルファイルをダウンロードします。RUN mkdir -p /data/models/LLM-Research/Llama-3.2-3B-Instruct && \\python3 -c "from modelscope import snapshot_download; snapshot_download('LLM-Research/Llama-3.2-3B-Instruct', local_dir='/data/models/LLM-Research/Llama-3.2-3B-Instruct')"推論サービスポートを公開します。EXPOSE 8000}# --host 0.0.0.0 すべてのネットワークインターフェースをリッスンします。# --port 8000 サービスがリッスンするポート。# --model モデルファイルのパス。# --trust-remote-code リモートコードを信頼します(一部のモデルで必要です)。# --dtype half 半精度推論を使用し、GPUメモリ使用量を削減します。# --max-model-len 8192 最大コンテキスト長。CMD ["--host", "0.0.0.0", \\"--port", "8000", \\"--model", "/data/models/LLM-Research/Llama-3.2-3B-Instruct", \\"--trust-remote-code", \\"--dtype", "half", \\"--max-model-len", "8192"]
パラメータ | 説明 |
FROM vllm/vllm-openai:v0.6.3.post1 | ベースイメージには、vLLM推論エンジンおよびOpenAI互換APIインターフェースがあらかじめ組み込まれています。 |
HF_HUB_OFFLINE=1 | オンラインモデル検証を無効にし、コンテナが外部ネットワークのない環境でも起動できるようにします。 |
--dtype half | FP16半精度推論を使用し、Llama-3.2-3Bモデルには約6GBのビデオメモリが必要です。 |
--max-model-len 8192 | 最大コンテキストウィンドウを8192トークンに設定します。 |
docker build -t llama3-3b-vllm:v1.0 .
docker images | grep llama3-3b-vllm
llama3-3b-vllm v1.0 xxxxxxxxxxxx xx minutes ago 約15GB
docker run --gpus all -p 8000:8000 llama3-3b-vllm:v1.0
Uvicorn running on http://0.0.0.0:8000が表示されます)。別のターミナルウィンドウでテストリクエストを実行します:curl http://localhost:8000/v1/chat/completions \\-H "Content-Type: application/json" \\-d '{"model": "/data/models/LLM-Research/Llama-3.2-3B-Instruct","messages": [{"role": "user", "content": "Hello!"}],"max_tokens": 50}'
edge-inference)。llama3-3b-vllm)。# 個人版 TCR ログインdocker login ccr.ccs.tencentyun.com --username=<Tencent CloudアカウントID>
<インスタンス名>.tencentcloudcr.comです。具体的なアドレスはTCRコンソールでご確認ください。# イメージにタグを付与します(実際のリポジトリアドレスに置き換えてください)docker tag llama3-3b-vllm:v1.0 ccr.ccs.tencentyun.com/edge-inference/llama3-3b-vllm:v1.0# TCRへのイメージのプッシュdocker push ccr.ccs.tencentyun.com/edge-inference/llama3-3b-vllm:v1.0

llm-inference-project)

設定項目 | 説明 | サンプル値 |
サービス名 | サービスの一意の識別子です。作成後に変更することはできません。 | llama3-3b-service |
説明 | サービスの用途説明です。最大60文字まで入力できます。 | Llama-3.2-3B 推論サービス |
設定項目 | 説明 | サンプル値 |
イメージ | お客様のアカウントでTCRにアップロード済みのイメージを選択します。 | ccr.ccs.tencentyun.com/edge-inference/llama3-3b-vllm:v1.0 |
起動コマンド | コンテナ起動時に実行するコマンドです。入力しない場合、イメージ内のENTRYPOINT/CMDが使用されます。 | 空欄にします(Dockerfileで定義済みのCMDを使用します)。 |
リッスンポート | お客様の推論サービスHTTP Serverがリッスンするポート | 8000 |
環境変数 | ランタイム環境変数の設定 | 変数名: HF_HOME、変数値:/data/models |
リクエストパス | クライアントが推論サービスを呼び出すAPIパス | /v1/chat/completions |
CMDにより起動パラメータが設定されているため、空のままにできます。デフォルトパラメータを上書きする必要がある場合は、完全な起動コマンドを入力できます。例:python3 -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --port 8000 --model /data/models/LLM-Research/Llama-3.2-3B-Instruct --trust-remote-code --dtype half --max-model-len 8192
設定項目 | 説明 |
リソースを選択します。 | 現在、入门型と基础型の2種類のGPUリソース仕様を提供しています。選択後は変更できません。 |
設定項目 | 説明 | 推奨設定 |
スケールイン・スケールアウト | 自動:リクエスト量に応じて自動的にスケールイン・スケールアウトします。 手動:インスタンス数を固定し、常駐稼働して継続的に課金されます。 | 自動を選択することをお勧めします。コストを節約できます。 |
同時実行数 | 単一インスタンスにおける同時リクエスト数の上限 | LLM推論では、やや大きめに設定することをお勧めします。画像生成などの長時間タスクでは、同時処理の上限を小さくする必要がある場合があります。モデルサイズとビデオメモリによって異なります。 |
https://your-service-id.edgeone-infer.com)。
my-first-token)。システムが自動的にAPI Tokenを生成します。
呼び出しモード | Work-Mode の値 | レスポンス方法 | 適用シナリオ |
同期(デフォルト) | 指定しない、またはsync | リクエストはブロックされ、完全な推論結果が直接返されます。 | リアルタイム対話、低遅延インタラクション、短い入出力のシナリオ |
非同期 | async | TaskIdを直ちに返し、クエリインターフェースを通じて結果をポーリングする必要があります。 | 長文テキスト生成、バッチタスク、ゲートウェイタイムアウトのリスクを回避するシナリオ |
curl https://YOUR_SERVICE_URL/v1/chat/completions \\-H "Authorization: Bearer YOUR_BEARER_TOKEN" \\-H "Content-Type: application/json" \\-d '{"model": "/data/models/LLM-Research/Llama-3.2-3B-Instruct","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello, who are you?"}],"max_tokens": 256,"temperature": 0.7}'
{"id": "cmpl-xxxxxxxx","object": "chat.completion","created": 1739260800,"model": "/data/models/LLM-Research/Llama-3.2-3B-Instruct","choices": [{"index": 0,"message": {"role": "assistant","content": "Hello! I'm Llama, a helpful AI assistant developed by Meta. I'm here to help you with questions, provide information, and assist with various tasks. How can I help you today?"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 25,"completion_tokens": 42,"total_tokens": 67}}
パラメータ | タイプ | 必須 | 説明 |
model | string | はい | モデルパス、コンテナ内のモデルファイルパスと一致します。 |
messages | array | はい | 対話メッセージリストです。role(system/user/assistant)とcontentが含まれます。 |
max_tokens | integer | いいえ | 最大生成token数です。デフォルトはモデルによって決定されます。 |
temperature | float | いいえ | 生成温度です。範囲は0~2で、値が高いほど出力はランダムになります。デフォルトは1.0です。 |
top_p | float | いいえ | 核サンプリングパラメータです。範囲は0~1で、デフォルトは1.0です。 |
stream | boolean | いいえ | ストリーミング出力を有効にするかどうかです。デフォルトは falseです。 |
stop | string/array | いいえ | 生成を停止するマーカー語 |
項目 | 説明 |
URL | 例: https://YOUR_SERVICE_URL/v1/chat/completions |
Method | POST |
Authorization | Bearer YOUR_BEARER_TOKEN |
Content-Type | application/json |
Work-Mode | async(必須、非同期モードを表します) |
curl -sS -X POST \\"https://YOUR_SERVICE_URL/v1/chat/completions" \\-H "Authorization: Bearer YOUR_BEARER_TOKEN" \\-H "Content-Type: application/json" \\-H "Work-Mode: async" \\-d '{"model": "/data/models/LLM-Research/Llama-3.2-3B-Instruct","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello, who are you?"}],"max_tokens": 256,"temperature": 0.7}'
{"TaskId": "YOUR_TASK_ID","Status": "PENDING"}
項目 | 説明 |
URL | 例: https://YOUR_SERVICE_URL/query/YOUR_TASK_ID |
Method | GET |
Authorization | Bearer YOUR_BEARER_TOKEN |
Work-Infer-Action | query(必須項目です。クエリアクションを示します。) |
curl -sS -X GET \\"https://YOUR_SERVICE_URL/query/YOUR_TASK_ID" \\-H "Authorization: Bearer YOUR_BEARER_TOKEN" \\-H "Work-Infer-Action: query"
Status | 意味 | 後続アクション |
PENDING | タスクは送信され、キューで待機しています。 | ポーリングを継続してください。 |
RUNNING | タスクは推論中です。 | ポーリングを継続してください。 |
SUCCEEDED | タスクは正常に実行されました。Responseフィールドに完全な推論結果が返されます。 | 結果を読み取り、ポーリングを停止してください。 |
FAILED | タスクの実行に失敗しました。Errorフィールドにエラー原因が返されます。 | 入力を確認するか、再試行してください。 |
{"TaskId": "YOUR_TASK_ID","Status": "SUCCEEDED","Response": {"id": "chatcmpl-abc123","object": "chat.completion","created": 1746789012,"model": "/data/models/LLM-Research/Llama-3.2-3B-Instruct","choices": [{"index": 0,"message": {"role": "assistant","content": "Hello! I'm Llama, a helpful AI assistant developed by Meta."},"finish_reason": "stop"}],"usage": {"prompt_tokens": 25,"completion_tokens": 42,"total_tokens": 67}}}
{"TaskId": "YOUR_TASK_ID","Status": "FAILED","Error": "エラー原因の説明"}
import timeimport requestsBASE = "https://YOUR_SERVICE_URL"TOKEN = "YOUR_BEARER_TOKEN"MODEL = "/data/models/LLM-Research/Llama-3.2-3B-Instruct"def submit_async():url = f"{BASE}/v1/chat/completions"headers = {"Authorization": f"Bearer {TOKEN}","Content-Type": "application/json","Work-Mode": "async",}payload = {"model": MODEL,"messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello, who are you?"},],"max_tokens": 256,"temperature": 0.7,}r = requests.post(url, headers=headers, json=payload, timeout=30)r.raise_for_status()return r.json()["TaskId"]def query_task(task_id, timeout=120, interval=1.0):url = f"{BASE}/query/{task_id}"headers = {"Authorization": f"Bearer {TOKEN}","Work-Infer-Action": "query",}deadline = time.time() + timeoutwhile time.time() < deadline:r = requests.get(url, headers=headers, timeout=15)r.raise_for_status()data = r.json()status = data.get("Status")if status == "SUCCEEDED":return dataif status == "FAILED":raise RuntimeError(f"task failed: {data}")time.sleep(interval)raise TimeoutError(f"task {task_id} timeout")if __name__ == "__main__":task_id = submit_async()print("submitted:", task_id)result = query_task(task_id)print(result["Response"]["choices"][0]["message"]["content"])
問題 | 考えられる原因 | 解決方法 |
サービスステータスは継続して「デプロイ中」と表示されています。 | イメージが大きすぎるため、プルに時間がかかります。 | 15~30分間待機します。イメージがTCRに正しくアップロードされているか確認します。 |
サービスステータスに「デプロイ失敗」と表示されます。 | GPUメモリ不足またはイメージ起動異常 | リソース仕様がモデル要件を満たしているか確認します。デプロイログを確認してエラーを特定します。 |
APIリクエストが401を返します。 | Tokenが無効または期限切れです。 | Authorizationヘッダーが正しいかどうかを確認します。Token形式が Bearer <token>であることを確認します。 |
APIリクエストが502/504を返します。 | サービスが準備できていないか、リクエストがタイムアウトしました。 | サービス状態が「実行中」であることを確認します。タイムアウト時間を適宜延長します。 |
OOMエラーが返されます。 | GPUメモリ不足 | --max-model-lenパラメータ値を下げます。より高规格のGPUリソースを選択します。 |
フィードバック