网站ico图标怎么用旅游公司网站设计
网站ico图标怎么用,旅游公司网站设计,企业seo价格查询价格,德阳市建设局网站GLM-4-9B-Chat-1M企业级部署架构#xff1a;高可用与负载均衡方案
想把GLM-4-9B-Chat-1M这个支持百万字长文本的大模型用起来#xff0c;自己搭个环境跑跑demo是一回事#xff0c;真要放到公司里给团队用#xff0c;那就是另一回事了。你肯定不希望系统动不动就卡住#…GLM-4-9B-Chat-1M企业级部署架构高可用与负载均衡方案想把GLM-4-9B-Chat-1M这个支持百万字长文本的大模型用起来自己搭个环境跑跑demo是一回事真要放到公司里给团队用那就是另一回事了。你肯定不希望系统动不动就卡住或者用户一多就排队等半天更别说万一服务器挂了整个服务就停摆。这篇文章就是来解决这些问题的。我们不聊怎么把模型跑起来那个网上教程很多。我们聊的是怎么把它部署成一个稳定、可靠、能扛得住真实业务压力的企业级服务。我会带你一步步搭建一个高可用、带负载均衡的架构让你部署的模型服务既稳定又高效。1. 为什么企业级部署需要不一样的思路你可能已经试过在单台服务器上部署GLM-4-9B-Chat-1M跑起来没问题生成效果也不错。但一旦想给更多人用问题就来了。首先是性能瓶颈。单台服务器的GPU显存和算力是有限的。GLM-4-9B-Chat-1M处理百万字上下文时对显存的需求很大。当多个用户同时请求时要么排队等待要么直接内存溢出导致服务崩溃。其次是可用性问题。服务器不可能永远不重启、不出故障。硬件老化、系统更新、网络波动任何一个环节出问题服务就中断了。对于企业应用来说这种单点故障是不可接受的。还有资源利用率的问题。用户的请求并不是均匀分布的白天可能很忙晚上就空闲了。单台服务器为了应对高峰期的流量往往需要配置很高的硬件但大部分时间这些资源都闲置着造成浪费。所以企业级部署的核心目标很明确保证服务始终可用合理分配计算资源让系统能随着业务增长而扩展。接下来我们要搭建的架构就是围绕这几个目标设计的。2. 整体架构设计从单点到集群我们先来看看最终要实现的架构是什么样子。整个系统可以分为四个层次接入层、服务层、推理层和存储层。接入层是用户接触到的部分负责接收请求并转发给后端的服务实例。这里我们会用Nginx做负载均衡把用户的请求均匀地分发给多个服务节点。服务层是业务逻辑所在的地方。每个服务节点都是一个独立的API服务封装了模型推理的逻辑。我们会部署多个这样的节点形成一个服务集群。推理层是实际运行模型的地方。考虑到GLM-4-9B-Chat-1M对显存的需求我们可能会用多张GPU卡甚至多台GPU服务器。这里的关键是让服务层能灵活地调用推理资源。存储层存放模型文件、配置信息和日志等。模型文件通常比较大我们会放在共享存储或者每个节点本地确保所有服务节点用的都是同一个版本的模型。这个架构的好处很明显。当某个服务节点出现故障时负载均衡器会自动把流量切到其他健康的节点用户几乎感觉不到中断。当用户量增加时我们只需要水平扩展服务节点就行不用重新设计整个系统。3. 基础环境准备与模型部署在开始搭建集群之前我们需要先把基础环境准备好。这里假设你已经对Linux和Docker有一定了解。3.1 硬件与系统要求GLM-4-9B-Chat-1M对硬件的要求不低。处理百万字上下文时建议至少准备以下配置GPU至少一张24GB显存的卡如RTX 4090处理长文本时显存占用会很高。如果预算充足A100 40GB或80GB会更好。内存64GB以上因为除了GPU显存系统内存也要足够加载模型权重和处理中间数据。存储至少100GB的SSD空间用于存放模型文件约20GB和系统文件。网络千兆或万兆网络确保节点间通信顺畅。操作系统建议使用Ubuntu 22.04 LTS这是目前最稳定的选择。我们需要安装Docker和NVIDIA容器工具包方便后续用容器化方式部署。# 安装Docker sudo apt-get update sudo apt-get install docker.io docker-compose # 安装NVIDIA容器工具包 distribution$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker3.2 单节点模型服务部署在搭建集群之前我们先在单台服务器上把模型服务跑起来。这里我们用vLLM作为推理后端它比原生的Transformers有更好的性能和内存管理。首先创建一个工作目录下载模型文件。你可以从Hugging Face或者ModelScope下载GLM-4-9B-Chat-1M的模型权重。# 创建工作目录 mkdir -p /opt/glm4-enterprise cd /opt/glm4-enterprise # 下载模型这里以ModelScope为例 git lfs install git clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat-1m.git models接下来创建一个Dockerfile构建我们的模型服务镜像# Dockerfile FROM nvidia/cuda:12.1.0-runtime-ubuntu22.04 # 安装Python和基础工具 RUN apt-get update apt-get install -y \ python3.10 \ python3-pip \ git \ rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 复制模型文件 COPY models /app/models # 安装Python依赖 COPY requirements.txt /app/ RUN pip3 install --no-cache-dir -r requirements.txt # 复制应用代码 COPY app.py /app/ # 暴露端口 EXPOSE 8000 # 启动命令 CMD [python3, app.py]requirements.txt文件内容vllm0.3.3 fastapi0.104.1 uvicorn[standard]0.24.0 pydantic2.5.0 transformers4.37.0app.py是主要的服务代码我们创建一个简单的FastAPI应用来提供模型推理服务# app.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from vllm import LLM, SamplingParams from transformers import AutoTokenizer import torch import os app FastAPI(titleGLM-4-9B-Chat-1M API) # 模型配置 MODEL_PATH /app/models MAX_MODEL_LEN 1048576 # 1M tokens TP_SIZE 1 # 张量并行度根据GPU数量调整 # 初始化模型和tokenizer print(正在加载模型...) llm LLM( modelMODEL_PATH, tensor_parallel_sizeTP_SIZE, max_model_lenMAX_MODEL_LEN, trust_remote_codeTrue, enforce_eagerTrue, gpu_memory_utilization0.9 ) tokenizer AutoTokenizer.from_pretrained( MODEL_PATH, trust_remote_codeTrue ) print(模型加载完成) # 请求和响应模型 class ChatRequest(BaseModel): messages: list max_tokens: int 1024 temperature: float 0.7 top_p: float 0.9 class ChatResponse(BaseModel): content: str usage: dict app.post(/v1/chat/completions) async def chat_completion(request: ChatRequest): try: # 准备输入 prompt tokenizer.apply_chat_template( request.messages, tokenizeFalse, add_generation_promptTrue ) # 设置生成参数 sampling_params SamplingParams( temperaturerequest.temperature, top_prequest.top_p, max_tokensrequest.max_tokens, stop_token_ids[151329, 151336, 151338] # GLM的特殊停止token ) # 生成回复 outputs llm.generate([prompt], sampling_params) generated_text outputs[0].outputs[0].text # 计算token使用量 input_tokens len(tokenizer.encode(prompt)) output_tokens len(tokenizer.encode(generated_text)) return ChatResponse( contentgenerated_text, usage{ prompt_tokens: input_tokens, completion_tokens: output_tokens, total_tokens: input_tokens output_tokens } ) except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.get(/health) async def health_check(): return {status: healthy, model: GLM-4-9B-Chat-1M} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)构建并运行这个Docker镜像# 构建镜像 docker build -t glm4-service:latest . # 运行容器 docker run -d \ --name glm4-service-1 \ --gpus all \ -p 8000:8000 \ glm4-service:latest现在访问http://服务器IP:8000/health应该能看到健康检查返回正常。你也可以用curl测试一下聊天接口curl -X POST http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { messages: [ {role: user, content: 你好请介绍一下你自己} ], max_tokens: 100 }单节点服务跑起来后我们就可以开始搭建集群了。4. 搭建高可用集群负载均衡与故障转移单节点服务只能算是个demo要用于生产环境我们需要至少两个服务节点并加上负载均衡。4.1 部署多个服务节点首先我们在同一台服务器上启动多个服务实例实际生产环境建议在不同服务器上部署。每个实例使用不同的端口# 启动第二个服务实例 docker run -d \ --name glm4-service-2 \ --gpus all \ -p 8001:8000 \ glm4-service:latest # 启动第三个服务实例 docker run -d \ --name glm4-service-3 \ --gpus all \ -p 8002:8000 \ glm4-service:latest现在我们有三个服务实例分别运行在8000、8001和8002端口。每个实例都是独立的有自己的模型加载和内存空间。4.2 配置Nginx负载均衡接下来配置Nginx作为负载均衡器。Nginx会把收到的请求按照一定策略分发给后端的服务节点。先安装Nginxsudo apt-get install nginx然后创建Nginx配置文件/etc/nginx/sites-available/glm4-clusterupstream glm4_backend { # 负载均衡策略轮询round-robin server 127.0.0.1:8000 max_fails3 fail_timeout30s; server 127.0.0.1:8001 max_fails3 fail_timeout30s; server 127.0.0.1:8002 max_fails3 fail_timeout30s; # 可以设置权重比如某个服务器配置更好 # server 127.0.0.1:8000 weight3; # 或者使用最少连接策略 # least_conn; } server { listen 80; server_name glm4.yourdomain.com; # 改成你的域名或IP # 客户端请求超时设置 client_max_body_size 100M; client_body_timeout 300s; send_timeout 300s; location / { proxy_pass http://glm4_backend; # 代理设置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 超时设置 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; # 启用长连接 proxy_http_version 1.1; proxy_set_header Connection ; } # 健康检查端点 location /health { proxy_pass http://glm4_backend/health; access_log off; } # Nginx状态页面可选用于监控 location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } }启用这个配置并重启Nginxsudo ln -s /etc/nginx/sites-available/glm4-cluster /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置 sudo systemctl restart nginx现在访问http://你的服务器IP/healthNginx会把请求轮流发给三个后端服务。你可以观察Nginx的访问日志看看请求是如何分布的sudo tail -f /var/log/nginx/access.log4.3 实现健康检查与故障转移Nginx的max_fails和fail_timeout参数已经提供了基本的健康检查功能。如果某个后端节点连续失败3次Nginx会在30秒内暂时把它从负载均衡池中移除。但我们还可以做得更好。创建一个专门的健康检查脚本定期检查每个服务节点的状态# health_check.py import requests import time import logging from datetime import datetime logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class ServiceHealthChecker: def __init__(self, endpoints): self.endpoints endpoints self.healthy_endpoints set(endpoints) self.check_interval 30 # 每30秒检查一次 def check_endpoint(self, endpoint): try: response requests.get(f{endpoint}/health, timeout5) if response.status_code 200: data response.json() return data.get(status) healthy return False except Exception as e: logger.warning(fEndpoint {endpoint} check failed: {e}) return False def run_checks(self): while True: current_time datetime.now().strftime(%Y-%m-%d %H:%M:%S) logger.info(f[{current_time}] Starting health checks...) for endpoint in self.endpoints: is_healthy self.check_endpoint(endpoint) if is_healthy and endpoint not in self.healthy_endpoints: logger.info(fEndpoint {endpoint} recovered, adding back to pool) self.healthy_endpoints.add(endpoint) elif not is_healthy and endpoint in self.healthy_endpoints: logger.warning(fEndpoint {endpoint} failed, removing from pool) self.healthy_endpoints.remove(endpoint) # 这里可以添加逻辑比如更新Nginx配置或通知运维人员 logger.info(fCurrent healthy endpoints: {list(self.healthy_endpoints)}) time.sleep(self.check_interval) if __name__ __main__: endpoints [ http://localhost:8000, http://localhost:8001, http://localhost:8002 ] checker ServiceHealthChecker(endpoints) checker.run_checks()这个健康检查器会定期检查每个服务节点的状态并记录哪些节点是健康的。在实际生产环境中你可以把这个信息集成到监控系统里或者用它来自动更新负载均衡配置。5. 生产环境优化与监控基本的集群搭好了但要真正用于生产还需要一些优化和监控措施。5.1 性能优化配置GLM-4-9B-Chat-1M处理长文本时有几个关键的优化点批处理优化当多个用户请求同时到达时可以把它们合并成一个批次一起处理这样能提高GPU利用率。vLLM支持动态批处理我们可以在初始化时配置llm LLM( modelMODEL_PATH, tensor_parallel_sizeTP_SIZE, max_model_lenMAX_MODEL_LEN, trust_remote_codeTrue, enforce_eagerTrue, gpu_memory_utilization0.9, max_num_seqs16, # 最大批处理大小 max_num_batched_tokens8192, # 每批最大token数 enable_chunked_prefillTrue # 启用分块预填充节省内存 )量化部署如果显存紧张可以考虑使用量化版本。GLM-4-9B-Chat-1M支持INT4量化能减少约60%的显存占用对性能影响很小llm LLM( modelMODEL_PATH, tensor_parallel_sizeTP_SIZE, max_model_lenMAX_MODEL_LEN, trust_remote_codeTrue, quantizationawq, # 使用AWQ量化 enforce_eagerTrue, gpu_memory_utilization0.9 )缓存优化对于长文本对话每次重新处理整个历史记录很浪费。可以启用KV缓存来加速后续的生成# 在请求中传递对话历史 class ChatRequest(BaseModel): messages: list max_tokens: int 1024 temperature: float 0.7 top_p: float 0.9 use_cache: bool True # 启用缓存 cache_id: Optional[str] None # 缓存标识5.2 监控与告警系统跑起来后我们需要知道它运行得怎么样。关键的监控指标包括服务可用性每个节点的健康状态、响应时间资源使用率GPU显存、GPU利用率、系统内存、CPU业务指标请求量、成功率、平均响应时间、token使用量可以用Prometheus Grafana搭建监控系统。首先为模型服务添加metrics端点# 在app.py中添加 from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST # 定义metrics REQUEST_COUNT Counter(glm4_request_total, Total requests) REQUEST_LATENCY Histogram(glm4_request_latency_seconds, Request latency) TOKEN_USAGE Counter(glm4_token_usage, Token usage, [type]) app.get(/metrics) async def metrics(): return Response(generate_latest(), media_typeCONTENT_TYPE_LATEST) # 在聊天接口中记录metrics app.post(/v1/chat/completions) async def chat_completion(request: ChatRequest): start_time time.time() REQUEST_COUNT.inc() try: # ... 原有的处理逻辑 ... # 记录token使用 TOKEN_USAGE.labels(typeprompt).inc(input_tokens) TOKEN_USAGE.labels(typecompletion).inc(output_tokens) # 记录延迟 REQUEST_LATENCY.observe(time.time() - start_time) return response except Exception as e: REQUEST_COUNT.labels(statuserror).inc() raise HTTPException(status_code500, detailstr(e))然后配置Prometheus收集这些metrics用Grafana展示仪表盘。这样你就能实时看到系统的运行状态设置告警规则比如当GPU显存使用超过90%时发送通知。5.3 日志与故障排查完善的日志系统能帮你快速定位问题。建议结构化日志包含请求ID、用户ID、处理时间等关键信息import json import uuid from contextlib import contextmanager import time class RequestLogger: def __init__(self): self.logger logging.getLogger(__name__) contextmanager def log_request(self, request_data): request_id str(uuid.uuid4())[:8] start_time time.time() log_entry { request_id: request_id, timestamp: datetime.now().isoformat(), action: chat_completion, input: request_data } self.logger.info(json.dumps(log_entry)) try: yield request_id except Exception as e: error_log { request_id: request_id, error: str(e), duration: time.time() - start_time } self.logger.error(json.dumps(error_log)) raise finally: end_log { request_id: request_id, duration: time.time() - start_time, status: completed } self.logger.info(json.dumps(end_log)) # 在聊天接口中使用 logger RequestLogger() app.post(/v1/chat/completions) async def chat_completion(request: ChatRequest): with logger.log_request({messages: request.messages[:1]}) as request_id: # 处理请求request_id可以用于追踪 response await process_chat(request, request_id) return response结构化日志方便用ELKElasticsearch, Logstash, Kibana或Loki等工具进行集中管理和分析。6. 扩展与维护建议系统上线后随着业务增长你可能需要进一步扩展和维护。水平扩展当现有集群处理能力不足时可以轻松地添加新的服务节点。只需要在新服务器上部署相同的服务然后更新Nginx的upstream配置即可。如果使用Kubernetes扩展就更简单了一个命令就能增加副本数。蓝绿部署更新模型版本或服务代码时为了避免影响线上服务可以采用蓝绿部署。先部署一套新的服务绿环境测试通过后把负载均衡的流量从旧环境蓝环境切换到新环境。如果新环境有问题可以快速切回。成本优化GPU资源很贵可以考虑混合部署策略。对于实时性要求高的请求用GPU集群处理对于批量任务或非实时分析可以用CPU集群或延迟处理。还可以根据业务流量规律在低峰期自动缩减集群规模。安全考虑企业级部署必须考虑安全。建议添加API密钥认证、请求限流、输入内容过滤等措施。对于敏感数据确保模型和数据都在内网环境不暴露到公网。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。