)
OpenELM-3B-Instruct FastAPI 部署调用实战从环境配置到接口服务Datawhale self-llm 教程【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm本教程基于开源仓库 datawhalechina/self-llm 中 models/OpenELM/01-OpenELM-3B-Instruct FastApi部署调用.md 整理而成完整讲解如何将 Apple 开源的 OpenELM-3B-Instruct 大模型在 Linux 环境中下载、加载并通过 FastAPI Uvicorn 封装为可对外提供 HTTP 服务的接口。读完本文你将掌握完整的模型下载流程含 Tokenizer 与权重分离下载技巧、FastAPI 服务端代码的编写思路以及使用 curl 与 Python requests 两种方式调用模型接口的实战方法。一、模型背景与教程定位OpenELM 是 Apple 公司开发的开源语言模型其核心特点是采用一种层级缩放layer-wise scaling策略对每个 Transformer 层的参数分配进行优化从而在提升模型效率与准确性的同时提供开放可复现的训练和推理框架包括数据集、训练日志与检查点。OpenELM 系列提供了多个规模的 Instruct 版本覆盖 270M、450M、1.1B、3B 等规格本教程以 OpenELM-3B-Instruct 为例展开部署。在 self-llm 仓库中OpenELM 模型的配套教程位于 models/OpenELM分为两个部分FastAPI 部署调用本文主体基于 transformers 加载模型并用 FastAPI 封装成 Web 服务Lora 微调02-OpenELM-3B-Instruct Lora微调.md 与同目录下的02-OpenELM-3B-Instruct Lora微调.ipynb讲解基于 peft 的高效微调流程。两篇教程共用同一套环境与模型下载方案完成部署后可直接衔接微调学习同时该模型也已收录于仓库的 support_model.md 支持模型清单中。二、环境准备本文基础环境如下---------------- ubuntu 22.04 python 3.10 cuda 12.1 pytorch 2.1.0 ----------------默认学习者已安装好上述 PytorchCUDA环境如未安装请先自行安装。2.1 pip 换源与依赖安装首先执行pip换源加速依赖包的下载然后安装本次部署所需的全部 Python 库python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope1.16.1 pip install transformers4.42.4 pip install fastapi0.111.1 pip install uvicorn0.30.3 pip install SentencePiece0.2.0 pip install accelerate0.33.0各依赖在本次部署中承担的角色如下依赖包版本作用modelscope1.16.1从 ModelScope 平台命令行下载模型权重与 Tokenizertransformers4.42.4加载模型与 Tokenizer执行文本生成推理fastapi0.111.1构建 HTTP 接口服务框架uvicorn0.30.3ASGI 服务器驱动 FastAPI 应用运行SentencePiece0.2.0分词相关依赖OpenELM 所用 Tokenizer 的配套库accelerate0.33.0支持device_mapauto的设备自动分配三、模型下载Tokenizer 与权重分离下载OpenELM 使用与 Llama2 相同的 Tokenizer因此下载时不需要重复下载完整的 Llama2 权重只需取其 Tokenizer 相关文件而 OpenELM 本身的权重则单独下载。使用 modelscope 命令行工具model参数指定模型名称local_dir参数指定下载到本地的路径modelscope download --model shakechen/Llama-2-7b-hf --local_dir /root/autodl-tmp/Llama-2-7b-hf --exclude .bin *.safetensors configuration.json modelscope download --model LLM-Research/OpenELM-3B-Instruct --local_dir /root/autodl-tmp/OpenELM-3B-Instruct第一条命令中--exclude参数将.bin、*.safetensors权重文件与configuration.json排除在外只保留 Tokenizer 所需的文件从而显著节省磁盘空间与下载时间。第二条命令完整下载 OpenELM-3B-Instruct 的模型权重。下载完成后本地目录结构为/root/autodl-tmp/Llama-2-7b-hf存放 Tokenizer 文件后续代码中作为tokenizer_path使用/root/autodl-tmp/OpenELM-3B-Instruct存放 OpenELM-3B-Instruct 模型权重后续代码中作为model_path使用。四、代码准备编写 FastAPI 服务端在/root/autodl-tmp路径下新建api.py文件写入以下完整代码代码包含详细注释便于理解各环节作用from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig import uvicorn import json import datetime import torch # 设置设备参数 DEVICE cuda # 使用CUDA DEVICE_ID 0 # CUDA设备ID如果未设置则为空 CUDA_DEVICE f{DEVICE}:{DEVICE_ID} if DEVICE_ID else DEVICE # 组合CUDA设备信息 # 清理GPU内存函数 def torch_gc(): if torch.cuda.is_available(): # 检查是否可用CUDA with torch.cuda.device(CUDA_DEVICE): # 指定CUDA设备 torch.cuda.empty_cache() # 清空CUDA缓存 torch.cuda.ipc_collect() # 收集CUDA内存碎片 # 创建FastAPI应用 app FastAPI() # 处理POST请求的端点 app.post(/) async def create_item(request: Request): global model, tokenizer # 声明全局变量以便在函数内部使用模型和分词器 json_post_raw await request.json() # 获取POST请求的JSON数据 json_post json.dumps(json_post_raw) # 将JSON数据转换为字符串 json_post_list json.loads(json_post) # 将字符串转换为Python对象 prompt json_post_list.get(prompt) # 获取请求中的提示 # 调用模型进行对话生成 model_inputs tokenizer(prompt, add_special_tokensTrue, return_tensorspt)[input_ids].cuda() generated_ids model.generate(model_inputs, max_length384) response tokenizer.decode(generated_ids[0], skip_special_tokensTrue) now datetime.datetime.now() # 获取当前时间 time now.strftime(%Y-%m-%d %H:%M:%S) # 格式化时间为字符串 # 构建响应JSON answer { response: response, status: 200, time: time } # 构建日志信息 log [ time ] , prompt: prompt , response: repr(response) print(log) # 打印日志 torch_gc() # 执行GPU内存清理 return answer # 返回响应 # 主函数入口 if __name__ __main__: # 加载预训练的分词器和模型 model_path /root/autodl-tmp/OpenELM-3B-Instruct tokenizer_path /root/autodl-tmp/Llama-2-7b-hf tokenizer AutoTokenizer.from_pretrained(tokenizer_path, use_fastFalse, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto, torch_dtypetorch.bfloat16, trust_remote_codeTrue) # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用4.1 代码要点逐段解析1设备与 GPU 内存管理DEVICE与DEVICE_ID共同组合出目标 CUDA 设备标识如cuda:0。torch_gc()函数在每次请求处理结束后显式调用torch.cuda.empty_cache()与torch.cuda.ipc_collect()前者清空 CUDA 缓存、后者回收显存碎片避免长时运行中显存持续累积。2模型加载方式主函数入口通过两个关键参数完成模型加载device_mapauto配合 accelerate 自动将模型各层分配到可用设备上torch_dtypetorch.bfloat16以 bfloat16 半精度加载权重显著降低显存占用trust_remote_codeTrueOpenELM 属于需要远程加载自定义代码的模型必须开启此参数Tokenizer 额外指定use_fastFalse使用慢速经典Tokenizer 加载。3请求处理链路POST /端点接收 JSON 请求体 → 提取prompt字段 → 经 Tokenizer 编码为 input_ids 并迁移到 CUDA → 调用model.generate(..., max_length384)生成续写文本 →skip_special_tokensTrue解码去除特殊标记 → 组装{response, status, time}结构返回。其中max_length384控制生成序列的最大长度与微调教程中数据格式化的MAX_LENGTH 384保持一致见 02-OpenELM-3B-Instruct Lora微调.md可按显存与任务需求自行调整。五、启动 API 服务在终端进入代码所在目录并运行cd /root/autodl-tmp python api.py如果在其他位置调用脚本也可以使用绝对路径python /root/api.py模型权重加载完毕后终端出现类似下图的信息即说明服务启动成功从日志可以看到两条关键信息Loading checkpoint shards: 100%表示模型权重分片加载完毕Uvicorn running on http://0.0.0.0:6006表示服务已默认部署在 6006 端口workers1单进程模式。由于 FastAPI 绑定了0.0.0.0容器/云主机内可通过端口映射将 6006 端口转发到本地后访问。六、调用接口curl 与 Python requests服务默认部署在 6006 端口通过 POST 方法进行调用。6.1 使用 curl 调用curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: Once upon a time there was}调用成功后的终端结果如下6.2 使用 Python requests 调用import requests import json def get_completion(prompt): headers {Content-Type: application/json} data {prompt: prompt} response requests.post(urlhttp://127.0.0.1:6006, headersheaders, datajson.dumps(data)) print(json.dumps(response.json())) return response.json()[response] if __name__ __main__: response get_completion(Once upon a time there was)6.3 返回结果解析服务端返回的 JSON 结构如下示例{response: Once upon a time there was a little girl named Rosie. Rosie loved to play dress-up, and her favorite costume was a princess dress. ..., status: 200, time: 2024-08-24 21:28:34}三个字段的含义response模型基于prompt续写生成的完整文本status固定为 200标识请求处理成功time服务端处理该请求的时间戳便于日志与调用方对账。七、进阶衔接部署与微调协同使用完成上述部署后如果希望针对特定场景优化模型可以直接衔接 models/OpenELM/02-OpenELM-3B-Instruct Lora微调.md 中的 Lora 微调流程。两者共用同一套环境依赖与模型下载方案同一份 Tokenizer 路径、同一model_path微调输出保存到autodl-tmp/output/openelm_3B_lora后可通过PeftModel.from_pretrained加载 Lora 权重进行推理再将推理逻辑替换进本文api.py的create_item端点即可实现微调模型在线服务化的完整链路。从微调文档的LoraConfig配置可以观察到 OpenELM 的模块命名特征target_modules[token_embeddings, qkv_proj, out_proj, proj_1, proj_2]即注意力部分由qkv_proj、out_proj等命名组成同时微调数据格式化中使用sep作为指令与回答的分隔标记与模型原生对话格式一致。这些信息有助于理解模型结构从而在部署阶段合理设置生成参数。八、常见问题与注意事项端口映射服务绑定 6006 端口在 AutoDL 等云平台使用时需将该端口映射到本地才能通过127.0.0.1:6006访问。显存占用模型以 bfloat16 加载配合device_mapauto自动分配设备若显存紧张可调低max_length384的取值。Tokenizer 路径不可混淆tokenizer_path指向只含 Tokenizer 文件的 Llama-2-7b-hf 目录model_path指向 OpenELM-3B-Instruct 权重目录二者不能互换。自定义模型必须开启trust_remote_codeOpenELM 需加载远程自定义代码加载 Tokenizer 与模型时该参数都必须为True。依赖版本兼容性本教程依赖列表transformers 4.42.4、accelerate 0.33.0 等已通过实战验证升级大版本可能导致加载行为变化。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考