背景
好不容易把ChatGLM2-6B
大语言模型部署好了,使用streamlit
方式启动起来了,终于可以愉快的玩耍了,然后想着申请一个域名,使用HTTPS
协议访问,但实践过程中,发现这个大语言模型的nginx
转发配置还是有点小小的与众不同,折腾了半天,终于研究出来了。如何在只有CPU
的Linux
服务器上部署ChatGLM2-6B
,可以参考这篇文章
先请教下ChatGLM2这个问题
不错,回答的很是专业,使用这个配置还是有点用,但并不能解决所有问题。可能会出现如下几个错误
ERR_INCOMPLETE_CHUNKED_ENCODING
在请求/static/js/main.ccfdda4f.js
这个js
文件的时候,可能会报ERR_INCOMPLETE_CHUNKED_ENCODING
错误,这是因为main.ccfdda4f.js
这个js
文件有1.1M
,nginx
的缓冲区不够用,需要修改nginx
缓冲区设置
location / {proxy_pass http://LLM;# main.ccfdda4f.js文件有1.1M,需要修改缓冲区大小proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的设置proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2)proxy_temp_file_write_size 2048k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
websocket报403错误
查看/_stcore/stream
请求,是与大模型建立websocket
连接,错误信息大致如下
failed: Error during WebSocket handshake: Unexpected response code: 403
,但如果使用80
或443
端口,则不会报这个错,只要是非80
和443
就会报这个错,根本原因是nginx
转发的时候必须设置Host
和Origin
请求头,并且值还要一样
location /_stcore/stream {proxy_pass http://LLM;# websocket配置proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_cache_bypass $http_upgrade;# Host与Origin必须设置,并且Host的值与Origin的值//后面的部分必须一致proxy_set_header Host "$http_host";proxy_set_header Origin "$scheme://$http_host";}
- 这里使用 h t t p h o s t 比 http_host比 httphost比host更准确
- 经过实测,只要
Host
和Origin
请求头$http_host部分的值相同就可以成功转发,即使随便写一个值,只要相同也可以成功转发
关于nginx中$host
、$http_host
、$proxy_host
的区别
变量 | 是否显示端口 | 值 |
---|---|---|
$host | 不显示端口 | 浏览器请求的ip,不显示端口 |
$http_host | 端口存在则显示 | 浏览器请求的ip和端口号 |
$proxy_host | 默认80端口不显示,其它显示 | 被代理服务的ip和端口号 |
完整的nginx配置如下
upstream LLM {server 127.0.0.1:8501;
}server {listen 30443 ssl;listen 443 ssl;listen 80;server_name chatglm.xxx.cn;ssl_certificate /etc/nginx/ssl/chatglm.xxx.cn.pem;ssl_certificate_key /etc/nginx/ssl/chatglm.xxx.cn.key;location / {proxy_pass http://LLM;# main.ccfdda4f.js文件有1.1M,需要修改缓冲区大小proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的设置proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2)proxy_temp_file_write_size 2048k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传}location /_stcore/stream {proxy_pass http://LLM;# websocket配置proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_cache_bypass $http_upgrade;# Host与Origin必须设置,并且Host的值与Origin的值//后面的部分必须一致proxy_set_header Host "$http_host";proxy_set_header Origin "$scheme://$http_host";}
}
总结
- 以上是一步一步摸索出来的,研究成果来之不易
- 任何看似简单的东西,动手实践后,才能理解的更加深刻
- 终于对
ChatGLM2-6B
有了一定的了解,还会继续对大语言模型进行训练和微调,与君共勉