网站域名改了帝国cms,网架公司招聘打板施工队伍,郑州营销型网站制作教程,网站建设管理费一能多少钱前言
2024年大模型火得一塌糊涂#xff0c;但很多公司不敢把业务数据往OpenAI、文心一言这些公网API传——合规问题、数据安全、成本控制#xff0c;哪个都是痛点。
我们公司从年中开始搞私有化部署#xff0c;踩了不少坑#xff0c;也积累了一些经验。Ollama是我们最终选定…前言2024年大模型火得一塌糊涂但很多公司不敢把业务数据往OpenAI、文心一言这些公网API传——合规问题、数据安全、成本控制哪个都是痛点。我们公司从年中开始搞私有化部署踩了不少坑也积累了一些经验。Ollama是我们最终选定的方案原因很简单部署简单、模型生态好、资源占用可控。这篇文章把整个过程记录下来从单机部署到多节点调度希望对有同样需求的朋友有帮助。为什么选Ollama市面上本地部署LLM的方案不少方案优点缺点Ollama部署简单模型库丰富功能相对基础vLLM推理性能强支持并发部署复杂硬件要求高llama.cpp资源占用小CPU可跑需要手动编译维护成本高LocalAI兼容OpenAI API社区相对小Text Generation WebUI界面友好性能一般我们的场景是内部知识库问答和代码辅助QPS不高但要稳定。Ollama的部署成本和维护成本都最低最终选了它。环境准备硬件要求跑大模型最重要的是显存。参考配置7B模型如Qwen2-7B8GB显存起步16GB流畅13B模型16GB显存起步24GB流畅70B模型至少48GB显存或者用多卡我们用的是RTX 409024GB跑Qwen2-7B绰绰有余13B也能跑。安装OllamaLinux一行命令curl-fsSL https://ollama.com/install.sh|sh验证安装ollama --version# ollama version is 0.5.4启动服务# 默认监听127.0.0.1:11434ollama serve# 如果需要远程访问设置环境变量OLLAMA_HOST0.0.0.0:11434 ollama serve设为systemd服务cat/etc/systemd/system/ollama.serviceEOF [Unit] DescriptionOllama Service Afternetwork-online.target [Service] ExecStart/usr/local/bin/ollama serve Userroot Restartalways RestartSec3 EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_MODELS/data/ollama/models [Install] WantedBydefault.target EOFsystemctl daemon-reload systemctlenableollama systemctl start ollama模型选择与下载常用模型推荐国内场景中文能力是刚需。实测下来这几个模型效果不错# 通义千问2推荐中文效果好ollama pull qwen2:7b ollama pull qwen2:72b# 大杯需要大显存# Llama3英文强中文一般ollama pull llama3.1:8b# 代码模型ollama pull codellama:7b ollama pull deepseek-coder:6.7b# 国产代码模型效果不错# 小模型CPU也能跑ollama pull phi3:mini# 3.8B参数轻量ollama pull gemma2:2b查看已下载模型ollama listNAME ID SIZE MODIFIED qwen2:7b xxx 4.4 GB 2 days ago deepseek-coder xxx 3.8 GB 1 week ago模型存储位置默认在~/.ollama/models可以通过环境变量改exportOLLAMA_MODELS/data/ollama/models模型文件很大建议放在SSD上加载速度快很多。基础使用命令行交互ollama run qwen2:7b 用Python写一个快速排序 def quicksort(arr): if len(arr) 1: return arr pivot arr[len(arr) // 2] left [x for x in arr if x pivot] middle [x for x in arr if x pivot] right [x for x in arr if x pivot] return quicksort(left) middle quicksort(right) # 测试 print(quicksort([3,6,8,10,1,2,1])) REST API调用Ollama默认提供HTTP API兼容OpenAI格式# 简单对话curlhttp://localhost:11434/api/generate -d{ model: qwen2:7b, prompt: 天空为什么是蓝色的, stream: false }# 流式输出curlhttp://localhost:11434/api/generate -d{ model: qwen2:7b, prompt: 写一首关于程序员的诗, stream: true }Python SDKimportollama# 简单对话responseollama.chat(modelqwen2:7b,messages[{role:user,content:解释一下什么是微服务架构}])print(response[message][content])# 流式输出forchunkinollama.chat(modelqwen2:7b,messages[{role:user,content:写一个Python装饰器的例子}],streamTrue):print(chunk[message][content],end,flushTrue)兼容OpenAI SDKOllama支持OpenAI格式的API现有代码改改endpoint就能用fromopenaiimportOpenAI clientOpenAI(base_urlhttp://localhost:11434/v1,api_keyollama# 随便填Ollama不校验)responseclient.chat.completions.create(modelqwen2:7b,messages[{role:system,content:你是一个专业的技术顾问},{role:user,content:Kubernetes和Docker的区别是什么}])print(response.choices[0].message.content)进阶配置自定义模型参数创建Modelfile定制模型行为catModelfileEOF FROM qwen2:7b # 系统提示词 SYSTEM 你是一个专业的代码审查助手。你的职责是 1. 分析代码中的潜在问题 2. 提出优化建议 3. 指出安全隐患 回答要简洁专业用中文。 # 调整参数 PARAMETER temperature 0.7 PARAMETER top_p 0.9 PARAMETER num_ctx 4096 EOF# 创建自定义模型ollama create code-reviewer -f Modelfile显存优化显存不够时的几个优化方向# 1. 减小上下文长度默认2048PARAMETER num_ctx1024# 2. 使用量化版本ollama pull qwen2:7b-q4_0# 4bit量化显存占用减半# 3. 关闭KV缓存复用PARAMETER num_keep0GPU选择多卡环境指定GPU# 只用第一张卡CUDA_VISIBLE_DEVICES0ollama serve# 用第2、3张卡CUDA_VISIBLE_DEVICES1,2ollama serve生产环境部署Nginx反向代理upstream ollama { server 127.0.0.1:11434; keepalive 32; } server { listen 443 ssl; server_name llm.internal.com; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; # 简单的Token认证 location /api/ { if ($http_authorization ! Bearer your-secret-token) { return 401; } proxy_pass http://ollama; proxy_http_version 1.1; proxy_set_header Connection ; proxy_read_timeout 300s; # 大模型响应慢超时要设长 } }Docker部署# docker-compose.ymlversion:3.8services:ollama:image:ollama/ollama:latestcontainer_name:ollamaports:-11434:11434volumes:-./models:/root/.ollamadeploy:resources:reservations:devices:-driver:nvidiacount:allcapabilities:[gpu]restart:unless-stoppeddocker-composeup -d# 进容器下载模型dockerexec-it ollama ollama pull qwen2:7b多节点负载均衡我们有三台GPU服务器用Nginx做负载均衡upstream ollama_cluster { least_conn; # 最少连接数 server 10.0.1.10:11434 weight2; # 4090权重高 server 10.0.1.11:11434 weight2; server 10.0.1.12:11434 weight1; # 3090权重低 keepalive 64; }三台机器分布在不同网段我用星空组网把它们串到一起统一管理。部署新模型或者更新配置时Ansible一条命令就能批量搞定。监控告警用Prometheus采集指标# 简单的健康检查脚本importrequestsimporttimedefcheck_ollama(host):try:starttime.time()resprequests.get(fhttp://{host}:11434/api/tags,timeout5)latencytime.time()-startreturnresp.status_code200,latencyexcept:returnFalse,0# 配合Prometheus的Pushgateway上报踩过的坑坑1首次加载慢第一次调用模型会很慢10-30秒因为要把模型加载到显存。解决服务启动后主动预热# 启动脚本里加预热curlhttp://localhost:11434/api/generate -d{ model: qwen2:7b, prompt: hello, stream: false }坑2长文本OOM上下文太长会显存溢出。解决限制num_ctx或者做文本分片defchunk_text(text,max_length2000):长文本分片chunks[]foriinrange(0,len(text),max_length):chunks.append(text[i:imax_length])returnchunks坑3并发性能差Ollama单实例并发能力有限高并发会排队。解决多实例 负载均衡或者换vLLM专门优化过并发坑4中文分词问题有些模型对中文支持不好输出会有乱码。解决优先用Qwen2、GLM等国产模型中文效果明显好很多实际效果分享一下我们的使用数据模型Qwen2-7B硬件RTX 4090 24GB平均响应时间2-5秒视问题复杂度每天调用量约2000次月成本电费约200元对比之前用OpenAI API每月几千块的API费用省下来了数据也不用出内网。总结Ollama确实降低了大模型私有化部署的门槛部署简单一行命令安装模型即拉即用生态丰富主流开源模型基本都有兼容性好OpenAI格式API迁移成本低资源可控7B模型消费级显卡就能跑当然它也有局限不适合高并发场景功能相对基础。如果需要更强的推理性能可以看看vLLM或TensorRT-LLM。对于大多数企业内部应用场景Ollama是一个性价比很高的选择。先跑起来后面再根据实际需求优化。