GLM-4-9B-Chat-1M部署教程:华为云ModelArts模型部署与在线服务API调用实测
GLM-4-9B-Chat-1M部署教程:华为云ModelArts模型部署与在线服务API调用实测
1. 引言
想象一下,你手头有一份长达300页的PDF合同,或者一整年的公司财报,你想让AI帮你快速总结核心条款、提取关键数据,甚至对比不同章节的差异。传统的大模型面对几十万字的文本,要么直接“罢工”,要么处理速度慢得像蜗牛。
今天要介绍的GLM-4-9B-Chat-1M,就是为了解决这个痛点而生的。它最大的亮点,就是那个惊人的“1M”——这意味着它能一次性处理大约200万汉字的超长文本。更关键的是,它只需要一张消费级显卡(比如RTX 3090)就能跑起来,对企业或个人开发者来说,部署门槛大大降低。
你可能听说过动辄需要上百G显存的千亿参数模型,但那些“巨无霸”对硬件要求太高。GLM-4-9B-Chat-1M走的是另一条路:在保持9B(90亿)这个相对轻量级参数规模的同时,通过技术优化,将上下文处理能力拉满到1M token。简单说,它就是为“长文本处理”这个专项任务而生的“特种兵”。
本教程将带你一步步在华为云ModelArts上,把这个“长文本特种兵”部署起来,并教你如何通过API调用它,让它为你处理那些令人头疼的长文档。
2. 环境准备与快速部署
2.1 为什么选择华为云ModelArts?
部署一个大模型,通常要操心服务器、显卡驱动、CUDA版本、Python环境等一系列繁琐的事情。华为云ModelArts提供了一个“开箱即用”的AI开发平台,它预置了主流的深度学习框架和GPU环境,让我们可以跳过环境搭建的坑,直接聚焦在模型本身。
对于GLM-4-9B-Chat-1M,ModelArts的优势在于:
- 免配置:无需手动安装CUDA、PyTorch等。
- 资源灵活:可以根据模型大小(如FP16的18G或INT4量化的9G)按需选择GPU实例,用完后释放,成本可控。
- 集成度高:部署成在线服务后,直接获得一个可调用的API端点,方便集成到自己的应用中。
2.2 创建Notebook开发环境
我们的第一步是在ModelArts上创建一个Notebook实例,作为部署和测试的“工作台”。
- 登录华为云:进入ModelArts控制台。
- 创建Notebook:在“开发环境 > Notebook”页面,点击“创建”。
- 关键配置选择:
- 镜像:选择 PyTorch 2.1.0 + CUDA 11.8 或更高版本的公共镜像。这是运行vLLM等推理框架的兼容环境。
- 资源规格:这是核心。GLM-4-9B-Chat-1M的官方FP16模型约18GB。为了流畅运行并留出缓冲,建议选择 GPU: 显存 >= 24GB 的规格,例如“GPU: 1*V100(32GB) | CPU: 8核 64GB”。
- 如果你想尝试更省资源的INT4量化版本(约9GB),那么“GPU: 1T4(16GB)”或“GPU: 1V100(16GB)”也基本够用。
- 存储配置:模型文件较大,建议给“/home/ma-user/work”目录挂载至少50GB的云硬盘(EVS)。
- 完成其他设置(如名称、网络),点击“立即创建”,等待几分钟实例启动。
2.3 一键部署脚本
实例启动后,打开JupyterLab,新建一个Python Notebook。我们将使用一个整合的脚本来完成从下载模型到启动服务的全过程。
# 安装必要的依赖包 !pip install vllm -U !pip install transformers !pip install fastapi uvicorn # 创建模型下载和启动脚本 import os model_name = "THUDM/glm-4-9b-chat-1m" local_model_dir = "/home/ma-user/work/models/glm-4-9b-chat-1m" # 可选:使用ModelArts提供的镜像缓存加速下载(如果可用) # os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' print("开始准备部署GLM-4-9B-Chat-1M...") # 使用vLLM启动推理服务 # 关键参数说明: # --model: 指定模型路径或HuggingFace ID # --tensor-parallel-size: 张量并行数,单卡设为1 # --max-model-len: 最大模型长度,这里设置为接近1M的983040 # --served-model-name: 服务名称,用于API调用 # --api-key: 设置一个简单的API密钥(生产环境应用更安全的方式) # --port: 服务端口,ModelArts Notebook通常开放7860, 8888等端口 start_command = f""" vllm serve {model_name} \\ --tensor-parallel-size 1 \\ --max-model-len 983040 \\ --served-model-name glm-4-9b-chat-1m \\ --api-key token-abc123 \\ --port 7860 """ print("启动命令已准备。由于下载模型和加载需要时间,请在新终端中执行以下命令:") print(start_command) print("\n注意:首次运行会下载约18GB的模型文件,请耐心等待。") 重要提示:直接在一个Notebook Cell中运行上述vllm serve命令会阻塞整个Notebook。更推荐的做法是:
- 在JupyterLab中,点击菜单栏的“File” -> “New” -> “Terminal”,打开一个系统终端。
- 在终端中,先进入工作目录:
cd /home/ma-user/work。 - 将上面
start_command变量中的命令复制粘贴到终端中执行。
这样,模型服务就在后台启动了。终端会显示加载进度,最终输出类似 INFO: Application startup complete. 和 INFO: Uvicorn running on http://0.0.0.0:7860 的信息,表示服务已就绪。
3. 在线服务API调用实测
服务启动后,它提供了一个与OpenAI API兼容的接口。这意味着你可以用类似调用ChatGPT API的方式来调用它。我们分几种方式来测试。
3.1 在Notebook中直接调用
首先,确保你的服务在7860端口运行。然后在另一个Notebook Cell中,使用requests库进行调用。
import requests import json # 配置API端点,注意:在ModelArts Notebook内部,使用 localhost 或 127.0.0.1 api_url = "http://127.0.0.1:7860/v1/chat/completions" headers = { "Content-Type": "application/json", "Authorization": "Bearer token-abc123" # 与启动命令中的--api-key对应 } # 构造一个简单的请求,先测试短文本 payload = { "model": "glm-4-9b-chat-1m", # 必须与 --served-model-name 一致 "messages": [ {"role": "user", "content": "你好,请介绍一下你自己。"} ], "max_tokens": 500, "temperature": 0.7 } response = requests.post(api_url, headers=headers, data=json.dumps(payload)) if response.status_code == 200: result = response.json() print("模型回复:") print(result['choices'][0]['message']['content']) else: print(f"请求失败,状态码:{response.status_code}") print(response.text) 如果一切正常,你会看到模型用中文进行的自我介绍,这表明基础服务调用成功了。
3.2 模拟长文本处理场景
现在,我们来测试它的核心能力——长文本处理。我们模拟一个场景:给它一篇长文章(这里我们用重复文本来模拟长度),让它进行总结。
# 生成一段模拟的长文本(约5000字符,远小于1M,但用于测试流程) long_text = "人工智能(AI)是计算机科学的一个分支,旨在创造能够执行通常需要人类智能的任务的机器。" * 200 prompt_for_summary = f""" 你是一个专业的文本总结助手。请阅读以下文本,并生成一个简洁的摘要,突出核心观点。 文本内容: {long_text} 请生成摘要: """ payload_long = { "model": "glm-4-9b-chat-1m", "messages": [ {"role": "user", "content": prompt_for_summary} ], "max_tokens": 300, "temperature": 0.3 # 降低温度,让总结更聚焦、稳定 } print("正在处理长文本总结请求...") response_long = requests.post(api_url, headers=headers, data=json.dumps(payload_long)) if response_long.status_code == 200: result_long = response_long.json() print("摘要生成成功:") print(result_long['choices'][0]['message']['content']) else: print(f"长文本处理请求失败,状态码:{response_long.status_code}") # 注意:如果文本真的非常长,可能需要检查启动命令中的 --max-model-len 参数是否足够大。 3.3 使用OpenAI SDK调用(推荐)
为了更贴近实际开发,我们可以使用OpenAI官方Python库的格式来调用,因为vLLM的API是兼容的。
# 安装openai库(如果未安装) !pip install openai from openai import OpenAI # 配置客户端,指向我们本地启动的vLLM服务 client = OpenAI( base_url="http://127.0.0.1:7860/v1", # vLLM的OpenAI兼容端点 api_key="token-abc123" # 无需Bearer前缀 ) # 使用ChatCompletion接口 def chat_with_model(messages, model="glm-4-9b-chat-1m", max_tokens=500): try: response = client.chat.completions.create( model=model, messages=messages, max_tokens=max_tokens, temperature=0.8, stream=False # 设为True可以流式输出 ) return response.choices[0].message.content except Exception as e: return f"调用出错:{e}" # 测试多轮对话 conversation = [ {"role": "user", "content": "深度学习和机器学习是什么关系?"} ] reply1 = chat_with_model(conversation) print("用户:深度学习和机器学习是什么关系?") print(f"AI:{reply1}\n") # 将上一轮回复加入历史,进行第二轮 conversation.append({"role": "assistant", "content": reply1}) conversation.append({"role": "user", "content": "能再举个例子说明吗?"}) reply2 = chat_with_model(conversation) print("用户:能再举个例子说明吗?") print(f"AI:{reply2}") 这种方式代码更清晰,也方便未来如果需要切换回官方的OpenAI服务,只需修改base_url和api_key即可。
4. 进阶:部署为ModelArts在线服务
在Notebook中测试成功后,如果你希望获得一个稳定、可被外部系统调用的API,就需要将其部署为ModelArts的“在线服务”。
4.1 准备模型部署包
在线服务需要我们将模型和推理代码打包。创建一个部署目录:
# 在终端中执行 mkdir -p /home/ma-user/work/deploy_glm cd /home/ma-user/work/deploy_glm 创建模型推理脚本 model.py:
# model.py from vllm import AsyncLLMEngine, SamplingParams from vllm.engine.arg_utils import AsyncEngineArgs from vllm.entrypoints.openai.api_server import build_async_application import asyncio from fastapi import FastAPI import uvicorn import os # 1. 定义模型加载函数(ModelArts会在启动服务时调用) def model_fn(model_dir): """ 加载模型,ModelArts会自动将模型存储挂载到model_dir参数指定的路径。 我们这里使用vLLM的AsyncLLMEngine。 """ # 假设我们将模型文件放在model_dir目录下 # 或者,如果直接从HuggingFace拉取,这里可以指定模型名称 # 为了部署稳定,建议先将模型下载到OBS,然后挂载过来。 model_path = model_dir # 或具体的模型子路径,如 os.path.join(model_dir, "glm-4-9b-chat-1m") engine_args = AsyncEngineArgs( model=model_path, tensor_parallel_size=1, max_model_len=983040, # 1M上下文 served_model_name="glm-4-9b-chat-1m", download_dir=None # 如果模型已存在,则不下载 ) engine = AsyncLLMEngine.from_engine_args(engine_args) return engine # 2. 定义预测函数(处理每个API请求) async def predict_fn(input_data, model): """ 处理请求。 input_data: 解析后的请求体(JSON)。 model: 上面model_fn返回的engine。 """ # 这里简化处理,实际vLLM的OpenAI服务器会处理路由。 # 对于直接部署,我们可以在这里实现简单的对话逻辑。 # 但更推荐使用vLLM内置的API服务器。 # 此处仅为示例,实际部署建议使用定制化的启动脚本。 pass # 3. 主程序(可选,用于本地测试部署包) if __name__ == "__main__": # 本地测试时,可以模拟启动 print("This is a model deployment package for ModelArts.") 创建服务启动脚本 serve.py(更实用的方式):
# serve.py - 使用vLLM内置服务器 import subprocess import sys import os def main(): model_dir = os.getenv("MODEL_DIR", "/home/ma-user/model") # ModelArts会设置MODEL_DIR环境变量 api_key = os.getenv("API_KEY", "default-token") # 启动vLLM服务器的命令 cmd = [ sys.executable, "-m", "vllm.entrypoints.openai.api_server", "--model", model_dir, "--tensor-parallel-size", "1", "--max-model-len", "983040", "--served-model-name", "glm-4-9b-chat-1m", "--api-key", api_key, "--host", "0.0.0.0", "--port", "8080" # ModelArts在线服务默认监听8080端口 ] # 执行命令 subprocess.run(cmd) if __name__ == "__main__": main() 创建配置文件 config.json:
{ "model_algorithm": "large_language_model", "model_type": "PyTorch", "runtime": "python3.9", "apis": [ { "name": "chat", "url": "/v1/chat/completions", "method": "post", "request": { "Content-Type": "application/json" }, "response": { "Content-Type": "application/json" } } ] } 4.2 上传模型与代码至OBS
- 将你的模型文件(如果已经从HuggingFace下载)上传到华为云对象存储服务(OBS)的一个目录,例如:
obs://your-bucket/models/glm-4-9b-chat-1m/。 - 将上面创建的
deploy_glm文件夹(包含serve.py,config.json等)也打包上传到OBS,例如:obs://your-bucket/code/deploy_glm.zip。
4.3 在ModelArts控制台创建在线服务
- 进入ModelArts控制台,“部署上线 > 在线服务”。
- 点击“创建”,选择“从OBS中选择模型和推理代码”。
- 模型配置:
- 模型来源:选择OBS中你的模型路径(
obs://your-bucket/models/glm-4-9b-chat-1m/)。 - 推理代码:选择OBS中你的代码压缩包路径(
obs://your-bucket/code/deploy_glm.zip)。 - 选择AI引擎:匹配你的代码环境(如
PyTorch 2.1.0 (Python3.9))。
- 模型来源:选择OBS中你的模型路径(
- 资源选择:与Notebook类似,选择GPU: 显存 >= 24GB的规格。
- 环境变量(可选但重要):可以设置
API_KEY等环境变量。 - 完成配置,提交部署。ModelArts会自动拉取模型和代码,启动容器。等待状态变为“运行中”。
部署成功后,你会获得一个公网可访问的预测地址(Endpoint)。使用这个地址替换之前测试代码中的 http://127.0.0.1:7860,就可以从任何地方调用你的GLM-4-9B-Chat-1M模型服务了。
5. 总结
通过以上步骤,我们完成了从零开始在华为云ModelArts上部署GLM-4-9B-Chat-1M模型的完整流程。我们来回顾一下关键点:
1. 模型价值再确认:GLM-4-9B-Chat-1M的核心优势是“大容量、小身材”。1M的超长上下文处理能力,使其非常适合文档摘要、合同审核、长篇小说分析、多篇报告对比等场景。而9B的参数规模,使得它在单张高性能消费级显卡上就能部署,性价比极高。
2. 部署流程核心:关键在于利用ModelArts的托管环境,避开复杂的底层配置。使用vLLM作为推理后端,能有效提升吞吐量和降低显存占用,特别是通过enable_chunked_prefill等优化技术后,处理长文本的效率更有保障。
3. 两种使用方式: - 开发测试:在ModelArts Notebook中直接启动服务,快速进行原型验证和功能测试。 - 生产部署:创建在线服务,获得稳定、可伸缩的API端点,便于集成到企业应用中。
4. 实践建议: - 资源选择:如果主要处理超长文本(接近1M),建议选择32GB显存或以上的GPU规格,为模型和KV缓存留足空间。若以128K以下的文本为主,16GB显存运行INT4量化版本也足够。 - API安全:生产环境中,务必替换简单的--api-key,结合ModelArts的自定义授权功能或在自己的应用层实现更完善的鉴权机制。 - 性能监控:通过ModelArts的控制台,监控服务的调用次数、响应延迟和资源利用率,以便及时调整。
GLM-4-9B-Chat-1M的出现,让长文本智能处理不再是少数拥有庞大算力团队的专利。通过华为云ModelArts这样便捷的云平台,每个开发者都能快速拥有一个强大的“长文档分析专家”。下一步,你可以尝试将其用于你的具体业务场景,比如构建一个智能合同审查助手,或是一个学术论文分析工具,探索其真正的潜力。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。