准备项 | 说明 |
腾讯云账号 | 已完成实名认证的腾讯云账号 |
企业版套餐 | 已订购 EdgeOne 企业版套餐 |
Docker 环境 | 本地已安装 Docker(建议 Docker 20.10+),用于构建和推送镜像 |
腾讯云容器镜像服务(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/models# 安装 modelscope 用于下载模型(使用国内镜像源加速)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 使用半精度推理,降低显存占用# --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 tokens |
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=<腾讯云账号ID>
<实例名>.tencentcloudcr.com,请参考 TCR 控制台获取具体地址。# 为镜像打标签(请替换为您的实际仓库地址)docker tag llama3-3b-vllm:v1.0 ccr.ccs.tencentyun.com/edge-inference/llama3-3b-vllm:v1.0# 推送镜像到 TCRdocker 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
配置项 | 说明 |
选择资源 | 当前提供入门型和基础型两种 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 错误 | 显存不足 | 降低 --max-model-len 参数值;选择更高规格的 GPU 资源 |
文档反馈