
基于vLLM部署Yuan2.0-2B-Mars推理服务从源码编译到OpenAI兼容API的完整实战指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llmYuan 2.0源2.0是浪潮信息发布的新一代基础语言大模型系列包含 102B、51B 与 2B 多个规模其中 2B 级模型对显存与磁盘要求较低非常适合作为学习与实践 vLLM 高性能推理部署的入门模型。本文以仓库中 04-Yuan2.0-2B vLLM部署调用.md 为骨架完整带你走通编译安装 vLLM → 下载模型 → 离线推理 → 原生 HTTP API 服务 → OpenAI 兼容 API 服务的全流程读完即可在单卡环境如 AutoDL RTX 3090/24G上把 Yuan2.0-2B 真正跑起来并对外提供服务。1. 为什么选择 vLLM 与 Yuan2.0-2B-MarsvLLM 是目前社区主流的开源大模型推理与部署服务系统其核心优势包括高效内存管理通过 PagedAttention 算法对 KV Cache 进行分页式管理显著降低显存碎片与浪费高吞吐推理支持 Continuous Batching连续批处理可同时处理大量请求加速文本生成易用与兼容与 HuggingFace/ModelScope 模型无缝集成内置 OpenAI 兼容的 API 服务器分布式扩展支持多 GPU 上的张量并行推理方便扩展到大模型。而 Yuan 2.0 系列中Yuan2-2B-Mars-hf是 2B 参数的最新迭代版本同系列还有 Februa、Janus 等迭代版本详见 models/Yuan2.0/README.md模型大小为 4.5GB训练与部署门槛低是验证 vLLM 部署链路的最佳选择。值得说明的是官方 pip 源中的 vLLM 发行版当时尚不支持 Yuan 2.0 的自定义模型代码因此本教程需要从 Yuan-2.0 官方仓库自带的第三方 vLLM 源码编译安装这是整个环境配置中与部署普通 Llama 系模型最大的不同点。2. 环境准备参考同目录的 01-Yuan2.0-2B FastApi 部署调用.md推荐在 AutoDL 平台租赁一张 RTX 309024G 显存的机器镜像选择PyTorch → 2.1.0 → 3.10(ubuntu22.04) → 12.1。vLLM 环境的核心要求为依赖版本要求PyTorch2.1.2CUDA12.1Python3.10镜像自带GPU24G 显存级显卡如 RTX 3090如果环境配置遇到困难也可以直接参考 General-Setting/01-pip、conda换源.md 对 pip 换源加速依赖安装。3. 配置 vLLM 环境两步编译安装由于 pip 版 vLLM 暂不支持 Yuan 2.0环境配置分为两步先拉取 Yuan-2.0 项目其中内置了适配 Yuan 2.0 的 vLLM 第三方源码再编译安装 vLLM 运行环境。Step 1. 拉取 Yuan-2.0 项目git clone Yuan-2.0 官方 Git 仓库地址即 IEIT-Yuan/Yuan-2.0Step 2. 编译安装 vLLM 运行环境# 进入 Yuan-2.0 项目内置的 vLLM 第三方源码目录 cd Yuan-2.0/3rdparty/vllm # 安装依赖 pip install -r requirements.txt # 安装 setuptools # vLLM 对 setuptools 的版本有要求对应 vllm-project/vllm issue #4961 # 将 pyproject.toml 中的 setuptools 修改为 69.5.1 vim pyproject.toml pip install setuptools 69.5.1 # 以可编辑模式编译安装 vLLM pip install -e .这里有三个关键点值得展开为什么必须编译安装Yuan 2.0 使用自定义的模型结构与分词器含sep、eod等特殊 token需要trust_remote_code加载远端代码。当时 PyPI 上的 vLLM 版本并未内置 Yuan 2.0 的模型注册因此官方在仓库3rdparty/vllm下维护了适配版本setuptools 版本锁定编译过程中若 setuptools 版本过新会导致构建失败需要将其固定为69.5.1pip install -e .的可编辑安装源码改动即时生效便于后续跟踪或微调 vLLM 对 Yuan 2.0 的支持代码。编译安装完成后可配合仓库中的 04-Yuan2.0-2B vLLM部署调用.ipynb 逐格执行后续步骤。4. 模型下载利用 AutoDL 文件存储避免重复下载模型下载使用 ModelScope 提供的snapshot_download函数第一个参数为模型名称cache_dir为模型下载路径建议使用绝对路径参见 General-Setting/03-模型下载.md。进入 AutoDL 平台先初始化机器对应区域的文件存储。文件存储的挂载目录为/root/autodl-fs其特点是不会随实例关机而丢失从而避免每次开机后重新下载 4.5GB 模型from modelscope import snapshot_download model_dir snapshot_download(YuanLLM/Yuan2-2B-Mars-hf, cache_dir/root/autodl-fs)模型大小为 4.5GB下载大概需要 5 分钟。下载完成后模型位于/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf后续所有加载与部署均指向该路径。5. 基于 vLLM 的离线推理离线推理分两步加载模型构造LLM引擎与调用generate生成文本。5.1 加载模型from vllm import LLM, SamplingParams import time # 配置采样参数 sampling_params SamplingParams(max_tokens300, temperature1, top_p0, top_k1, min_p0.0, length_penalty1.0, repetition_penalty1.0, stopeod, ) # 加载模型 llm LLM(model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, trust_remote_codeTrue)SamplingParams各参数的作用如下参数取值说明max_tokens300单次生成的最大 token 数temperature1采样温度值越大输出越随机1 为 vLLM 默认值top_p0核采样概率阈值0 表示关闭核采样top_k1Top-K 采样取 1 即贪心解码每次选概率最高的 tokenmin_p0.0最小概率过滤阈值低于该比例的 token 被裁剪length_penalty1.0长度惩罚系数repetition_penalty1.0重复惩罚系数1 可抑制重复生成stopeod停止符eod是 Yuan 2.0 的结束标记生成遇到它即停止LLM(model..., trust_remote_codeTrue)中trust_remote_code必不可少——Yuan 2.0 的模型定义依赖远端代码关闭该选项将无法加载。从仓库 ipynb 的实际运行日志对应 04-Yuan2.0-2B vLLM部署调用.ipynb可以看到引擎初始化时的关键信息INFO llm_engine.py:73] Initializing an LLM engine with config: model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, tokenizer..., trust_remote_codeTrue, dtypetorch.bfloat16, max_seq_len8192, tensor_parallel_size1, ... INFO llm_engine.py:231] # GPU blocks: 1627, # CPU blocks: 780 INFO model_runner.py:412] Capturing the model for CUDA graphs. ... INFO model_runner.py:416] CUDA graphs can take additional 1~3 GiB memory per GPU. If you are running out of memory, consider decreasing gpu_memory_utilization or enforcing eager mode. INFO model_runner.py:458] Graph capturing finished in 7 secs.这段日志包含三条对实际调优很有用的信息模型以torch.bfloat16精度加载、max_seq_len为 8192与 README 中 2B 模型 8K 序列长度一致、tensor_parallel_size1单卡推理CUDA Graph 捕获会额外占用每卡 1~3 GiB 显存若显存不足可调小gpu_memory_utilization或加--enforce-eager关闭 CUDA Graph。5.2 单个 prompt 推理prompts [给我一个python打印helloword的代码sep] start_time time.time() outputs llm.generate(prompts, sampling_params) end_time time.time() for output in outputs: prompt output.prompt generated_text output.outputs[0].text print(Prompt:, prompt) print(Generated text:, generated_text) print() print(inference_time:, (end_time - start_time))注意 prompt 末尾的sep分隔符Yuan 2.0 的分词器注册了sep等特殊 token在 FastApi 部署教程中可见tokenizer.add_tokens([sep, ...])的定义请求必须以sep结尾模型才会将其理解为对话指令的结束位置。实际运行输出摘自仓库 ipynb 运行结果如下Prompt: 给我一个python打印helloword的代码sep Generated text: 以下是一个简单的Python代码用于打印字符串hello world python print(hello world)inference_time: 0.47487425804138184### 5.3 多个 prompt 批量推理 vLLM 天然支持批量输入只需将 prompt 列表扩展为多个元素引擎会自动进行批处理 python prompts [给我一个python打印helloword的代码sep, 给我一个c打印helloword的代码sep] start_time time.time() outputs llm.generate(prompts, sampling_params) end_time time.time() for output in outputs: prompt output.prompt generated_text output.outputs[0].text print(Prompt:, prompt) print(Generated text:, generated_text) print() print(inference_time:, (end_time - start_time))多 prompt 场景下引擎日志显示Processed prompts: 100%|...| 2/2两个请求在一次批处理中完成实测整体耗时约 0.6 秒这正是 vLLM Continuous Batching 高吞吐特性的直观体现。6. 基于 vllm.entrypoints.api_server 部署原生 HTTP 服务离线推理之外vLLM 还提供 HTTP 服务入口方便将 Yuan2.0-2B 包装为可被任意客户端调用的推理服务。原生api_server使用/generate端点。6.1 服务发起# 请在命令行运行以下命令不要在 Jupyter 中直接用 !python 运行 python -m vllm.entrypoints.api_server --model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf --trust-remote-code启动成功后服务默认监听0.0.0.0:8000日志中会依次出现模型加载、tokenizer 初始化、Starting API server process...与Waiting for application startup...等标志性输出。若需要在本地访问 AutoDL 上的服务可参考 General-Setting/02-AutoDL开放端口.md 配置端口映射。6.2 服务调用服务调用有两种方式命令行 curl 直接调用或编写 Python 脚本批量调用。Option 1. 基于命令行调用服务curl http://localhost:8000/generate -d {prompt: 给我一个python打印helloword的代码sep, use_beam_search: false, n: 1, temperature: 1, top_p: 0, top_k: 1, max_tokens:256, stop: eod}返回结果为 JSONtext字段即生成文本包含sep前缀的完整回显{text:[给我一个python打印helloword的代码sep 以下是一个简单的Python代码用于打印字符串\hello world\\npython\nprint(\hello world\)\n]}Option 2. 基于脚本调用服务import requests import json prompt 给我一个python打印helloword的代码sep raw_json_data { prompt: prompt, logprobs: 1, max_tokens: 256, temperature: 1, use_beam_search: False, top_p: 0, top_k: 1, stop: eod, } json_data json.dumps(raw_json_data) headers { Content-Type: application/json, } response requests.post(fhttp://localhost:8000/generate, datajson_data, headersheaders) output response.text output json.loads(output) print(output)两种方式的核心请求体字段完全一致脚本方式便于在循环中批量构造请求、解析结果适合做压测或集成到上层应用。7. 基于 vllm.entrypoints.openai.api_server 部署 OpenAI 兼容服务原生api_server的/generate端点是 vLLM 私有的若希望服务能被 OpenAI SDK、LangChain 等生态直接调用则应使用openai.api_server入口它暴露标准的/v1/completions、/v1/chat/completions、/v1/models等端点调用方式与 Step 3 类似。7.1 服务发起# 请在命令行运行以下命令不要在 Jupyter 中直接用 !python 运行 python -m vllm.entrypoints.openai.api_server --model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf --trust-remote-code7.2 服务调用Option 1. 基于命令行调用服务curl http://localhost:8000/v1/completions -H Content-Type: application/json -d {model: /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, prompt: 给我一个python打印helloword的代码sep, max_tokens: 300, temperature: 1, top_p: 0, top_k: 1, stop: eod}返回结构完全遵循 OpenAI Completions 协议包含id、object、choices与usagetoken 统计等字段{id:cmpl-5f7c39b38f4048928f0c2c6482174a72,object:text_completion,created:17034486, model:/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, choices:[{index:0,text: 以下是一个简单的Python代码用于打印字符串\hello world\\npython\nprint(\hello world\)\n,logprobs:null,finish_reason:stop}], usage:{prompt_tokens:11,total_tokens:39,completion_tokens:28}}其中usage.prompt_tokens11、completion_tokens28、total_tokens39可用于计费、监控与限流finish_reasonstop表明生成由eod停止符正常终止。Option 2. 基于脚本调用服务import requests import json prompt 给我一个python打印helloword的代码sep raw_json_data { model: /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, prompt: prompt, max_tokens: 256, temperature: 1, use_beam_search: False, top_p: 0, top_k: 1, stop: eod, } json_data json.dumps(raw_json_data, ensure_asciiTrue) headers { Content-Type: application/json, } response requests.post(fhttp://localhost:8000/v1/completions, datajson_data, headersheaders) output response.text output json.loads(output) print(output)脚本中比原生端点调用多了一个model字段OpenAI 协议要求其余采样参数保持一致。由于接口兼容 OpenAI 协议后续还可以直接用openaiPython SDK 或 LangChain 的OpenAI组件以base_urlhttp://localhost:8000/v1接入该服务实现上层应用的无缝迁移参考仓库中 02-Yuan2.0-2B Langchain 接入.md 的接入思路。8. 两种 API Server 的选型总结对比项原生 api_serverOpenAI 兼容 api_server启动入口vllm.entrypoints.api_servervllm.entrypoints.openai.api_server请求端点/generate/v1/completions、/v1/chat/completions、/v1/models请求体无model字段必须携带model字段返回结构简化的textJSONOpenAI 标准结构含choices、usage生态适配仅限 vLLM 客户端OpenAI SDK、LangChain 等通用客户端两者默认均监听8000端口且都要求命令行启动不建议在 Jupyter 中用!python运行以避免信号处理与资源释放异常。对需要长期对外提供服务、对接 OpenAI 生态的场景直接选择 OpenAI 兼容版本即可。9. 小结与延伸至此我们完整走通了从零部署 Yuan2.0-2B-Mars 推理服务的全部链路先以源码编译方式安装适配 Yuan 2.0 的 vLLM再通过 ModelScope 将 4.5GB 模型下载至 AutoDL 持久化文件存储随后依次体验了离线批量推理、原生/generateHTTP 服务与 OpenAI 兼容的/v1/completions服务并理解了SamplingParams各采样参数、sep输入约定与eod停止符等 Yuan 2.0 特有的使用细节。在此基础上可以继续阅读仓库中的进阶内容通过 05-Yuan2.0-2B Lora微调.md 了解如何在推理之外对模型进行高效微调或通过 01-Yuan2.0-2B FastApi 部署调用.md 对比原生 transformers 推理与 vLLM 在工程形态上的差异从而构建一套完整的微调 推理 服务化生产链路。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考