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实例,作为部署和测试的“工作台”。

  1. 登录华为云:进入ModelArts控制台。
  2. 创建Notebook:在“开发环境 > Notebook”页面,点击“创建”。
  3. 关键配置选择
    • 镜像:选择 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)。
  4. 完成其他设置(如名称、网络),点击“立即创建”,等待几分钟实例启动。

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。更推荐的做法是:

  1. 在JupyterLab中,点击菜单栏的“File” -> “New” -> “Terminal”,打开一个系统终端。
  2. 在终端中,先进入工作目录:cd /home/ma-user/work
  3. 将上面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_urlapi_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

  1. 将你的模型文件(如果已经从HuggingFace下载)上传到华为云对象存储服务(OBS)的一个目录,例如:obs://your-bucket/models/glm-4-9b-chat-1m/
  2. 将上面创建的 deploy_glm 文件夹(包含serve.py, config.json等)也打包上传到OBS,例如:obs://your-bucket/code/deploy_glm.zip

4.3 在ModelArts控制台创建在线服务

  1. 进入ModelArts控制台,“部署上线 > 在线服务”。
  2. 点击“创建”,选择“从OBS中选择模型和推理代码”。
  3. 模型配置
    • 模型来源:选择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))。
  4. 资源选择:与Notebook类似,选择GPU: 显存 >= 24GB的规格。
  5. 环境变量(可选但重要):可以设置API_KEY等环境变量。
  6. 完成配置,提交部署。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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

手把手用ROS实现Ego-Planner动态避障:无人机撞树问题终结方案

手把手用ROS实现Ego-Planner动态避障:无人机撞树问题终结方案 你是否曾满怀期待地启动无人机,看着它在仿真环境中流畅起飞,却在下一秒“砰”地一声撞上突然出现的障碍物,仿真画面定格,留下一串令人沮丧的报错信息?在复杂、非结构化的真实飞行场景中,比如在枝叶交错的林间穿行,或在有行人、车辆移动的城区执行任务,传统的全局规划器往往显得力不从心。它们规划的路径可能全局最优,但面对瞬息万变的局部环境,反应速度跟不上变化,导致“撞树”成了家常便饭。今天,我们不谈空洞的理论对比,而是聚焦于一个能真正解决这个痛点的方案——Ego-Planner,并带你一步步在ROS和Gazebo搭建的仿真世界里,亲手实现一个能“眼观六路、随机应变”的无人机大脑。 本文面向的是已经具备一定ROS和无人机仿真基础,正被动态避障问题困扰的开发者、研究者或高级爱好者。我们将彻底抛开宏观的算法优劣论述,直接深入到代码配置、参数调优和实战排错层面。你将看到的不是“Ego-Planner实时性更好”这样的结论,而是“如何设置距离场梯度计算的网格分辨率”、“碰撞反作用力系数调到多少能让无人机既灵活又稳定”的具体操作。我们

基于FPGA的积分梳状CIC滤波器Verilog设计探秘

基于FPGA的积分梳状CIC滤波器Verilog设计探秘

基于FPGA的积分梳状CIC滤波器verilog设计 1.系统概述 这里设计的五级CIC滤波器。 那么其基本结构如上图所示,在降采样的左右都有五个延迟单元。 但是在CIC滤波的时候,会导致输出的位宽大大增加,但是如果单独对中间的处理信号进行截位,这会导致处理精度不够,从而影响整个系统的性能,所以,这里我们首先将输入的信号进行扩展。 由于我们输入的中频信号通过ADC是位宽为14,在下变频之后,通过截位处理,其输出的数据仍为14位,所以,我们将CIC滤波的输入为14位,但是考虑到处理中间的益处情况以及保证处理精度的需要,我们首先将输入位宽扩展为40位,从而保证了处理精度以及溢出的情况。 这里首先说明一下为什么使用的级别是5级。 从硬件资源角度考虑,CIC滤波器的级数太高,会导致最终输出的数据位宽很大,通过简单的验证,当CIC的级数大于5的时候,输出的位宽>50。 这显然会导致硬件资源的大量占用,如果CIC级数太小,比如1,2级。 这在其处理效果上没有任何意义,基本无法达到预计的效果,通过仿真分析,一般情况下,选择4级,5级比较合理,因此,这里我们选择5级的CIC滤波器。 2.系统仿真效果预

Node.js 20+ 用crypto.webcrypto加密提速

Node.js 20+ 用crypto.webcrypto加密提速

💓 博客主页:瑕疵的ZEEKLOG主页📝 Gitee主页:瑕疵的gitee主页⏩ 文章专栏:《热点资讯》 Node.js 20+ 用 crypto.webcrypto 加密提速:性能优化实战指南 目录 * Node.js 20+ 用 crypto.webcrypto 加密提速:性能优化实战指南 * 引言:加密性能的隐性瓶颈 * 一、加密性能的痛点与挑战:为什么需要提速? * 二、crypto.webcrypto:从Web标准到Node.js的演进 * 三、Node.js 20+ 的性能跃迁:实测与代码优化 * 3.1 基准测试:真实场景的性能对比 * 3.2 优化代码实践:安全与性能的平衡 * 四、实战应用场景:从支付到IoT的性能革命

用playwright封装一个处理web网页的爬虫,并隐藏自动化特征,自动处理反爬

更多内容请见: 《爬虫和逆向教程》 - 专栏介绍和目录 文章目录 * 一、脚本概述 * 1.1 脚本对应反爬措施 * 1.2 注意事项 * 1.3 反爬细节说明 * 二、完整代码 * 2.1 安装依赖 * 2.2 封装代码 * 2.3 使用示例 下面是一个使用 Playwright 封装的、具备反爬对抗能力的网页爬虫Python函数,返回原始 HTML 内容,并重点隐藏自动化特征,避免被检测为 bot。 一、脚本概述 该封装已在多个中等反爬网站(如电商、新闻站)验证有效,能绕过大多数基于 navigator.webdriver、chrome 对象、permissions 等的检测。