05月09日
一、今日完成情况
- 完成大模型A100 的部署并且端口打通
- 查看邮局的使用方式
- 提词器的代码重构是否可以接入本地模型
- 命理学:学习子女宫这一块的原理
二、今日感悟
- 核心业务数据:
- 王晶让我干的API LLM部署完毕,不容易呀
- 廖师兄的干货,我这两天需要好好消化一下
- 今日工作总结:
- 网络安全挺重要的,需要开始重视起来了,信息加密,端口不能泄露
- 李书扬如果是博一的话,好厉害了,他还会白嫖Codex
- 端口内网转发需要李舒扬管理员权限搞一下,不然没辙
- 关于经费报销的事情,对接黄晓薇师姐。
- 明日工作计划:
- 完成作业,包括:PPT演讲、考试内容梳理准备、网络基础作业完成
- 今日学习成长:
- 赶紧把cursor的额度花完,不然过期了,看看Codex方不方便
三、备注
需要我之前的去噪模型,其实建议去链接之前集成的服务器(3090,刚好够部署去噪模型),那个比较清晰,45608端口的机子里面穿插了好几个项目,比较杂不好找。
之前集成项目的服务器地址:
服务器:121.48.163.69:2224 fzdwxxcl.511
容器:docker exec -it alg_pro /bin/bash
python路径:/root/anaconda3/bin/python
项目路径:/home/Projects/algorithmProject
我的那部分文件在:/home/Projects/algorithmProject/Event_l
微调的去噪模型在:/home/Projects/algorithmProject/Event_l/Model
这个服务器比较硬件比较老,vs新版不兼容,建议直接ssh链,或者cursor去连接。或者去问一下王老板、徐老板,我们之前都在这里部署
A100的45608你可以用,但东西其实很杂,45619端口我存了点自己的数据和项目,可以的话暂时先别动
四、紫薇斗术分析
1、个人特点分析
这是一份剥离了滤镜的客观命理诊断报告。根据你提供的截图,该男命的格局具有非常鲜明的“偏科”和“技术/研究型”特征。以下是各项指标的硬核拆解:
1. 核心性格底色:高智、多疑、易内耗
- 出厂设置(命无正曜): 命宫无主星,意味着自我意识的边界比较模糊。他不是那种从小就有极强目标感和坚定信仰的人,其性格和发展方向极度依赖外部环境的塑造(六分之一的概率,不算罕见,但意味着缺乏明确的主攻方向)。
- 外挂引擎(借对宫太阳、巨门): 由于本身无主星,他的行为模式完全由迁移宫的“太阳+巨门”接管。
- 巨门(庙):精准的扫描仪与双刃剑。 巨门星极亮,代表他拥有极强的逻辑分析能力、怀疑精神和洞察力,凡事都能看得比常人深,能一眼看穿漏洞。但副作用非常直接:嘴毒、爱抬杠、带有隐性傲气。他的言论往往一针见血,甚至偏向消极和刻薄,极其容易引发人际冲突和反感。
- 太阳(落地/陷):能量不足的探照灯。 太阳主发散,但处于弱势位置,导致他虽然聪明且有时想热心助人,但续航力极差。做事容易五分钟热度、虎头蛇尾。精神上容易疲劳,常常吃力不讨好,属于典型的高智商但容易心力交瘁的类型。
2. 事业与财富逻辑:靠脑力与专业壁垒吃饭
- 财帛宫(天机利、天梁庙): 这是他安身立命的根本。天机主智力、天梁主原则与专长。他赚钱的路径非常清晰——绝对不能靠体力或拼情商,必须靠纯粹的脑力、专业技能、策划推演或顾问咨询来获取财富。
- 事业宫(天同陷、太阴陷): 事业内驱力存在硬伤。天同太阴双双落陷,意味着他在高压、竞争惨烈或需要极强进取心的职场环境中会非常痛苦。他容易产生得过且过、情绪化或逃避的心理,抗压能力有限。
- 核心救赎(吉星满配,凶星为零): 他的三方四正汇聚了化权、化科、左辅、文曲,且没有煞星干扰。这是这个盘最大的底牌。这意味着只要他在某个垂直领域深耕,就能获得实际的权力(化权)、良好的业内名声(化科),并且总能在关键时刻得到他人协助(左辅)。文曲加持了巨门,使其具备出色的文案或学术表达能力。
3. 潜藏的雷区与变数(辅星揭示)
- 直觉极高(阴煞+天巫): 他拥有非常强的第六感,对环境的变化和人心的善恶有极其敏锐的捕捉能力。
- 小人隐患(伏兵+巨门): 命宫带有“伏兵”,且主导星是容易引爆口舌是非的巨门。他一生中最需要防范的就是“暗处的冷箭”。很多时候,他可能因为一句自认为客观但实际上刻薄的话,在无意中得罪了人,从而被人在背后使绊子。
客观总结与生存建议
整体画像: 这是一个典型的“专业技术派”或“学术研究者”的配置。他不适合在复杂的官场或需要八面玲珑的销售圈混,但他可以在需要深度逻辑、排错(Debug)、分析推演的领域做到顶尖。
执行建议:
- 扬长避短: 把巨门的“挑剔”和“怀疑”全部倾注到工作和事物上(比如学术分析、代码审查、系统架构),绝对不要用在人际交往中。
- 闭嘴保平安: 必须刻意练习“看破不说破”。他的人际灾难几乎全来自于他的嘴和过度理性的批判欲。
- 专注深耕: 既然容易“虎头蛇尾”(太阳陷)且“缺乏特定方向”(命无正曜),最聪明的策略就是利用“化权+化科”的吉星优势,死磕一门硬核技术或专业,用绝对的专业壁垒来掩盖性格上的不讨喜。
五、 Qwen3-32B 本地 vLLM 部署与调用说明
本文说明在本机已通过 Hugging Face 缓存下载 Qwen/Qwen3-32B 后,如何用项目内脚本启动 vLLM OpenAI 兼容服务,以及如何用 main.py 或其它客户端调用。
一、前置条件
| 项目 | 说明 |
|---|---|
| Python / Conda | 已安装 vLLM(建议 ≥ 0.8.5;本项目脚本按 vLLM 0.17+、--reasoning-parser qwen3 编写) |
| GPU | 单卡 80GB 级别(如 A100 80GB)可满足 BF16 权重与 KV 缓存;脚本默认只用 第 1 张卡 |
| 模型 | 已下载到 HF 缓存:~/.cache/huggingface/hub/ 下对应 models--Qwen--Qwen3-32B(或使用本地目录 MODEL=/path/to/Qwen3-32B) |
| 网络 | 缓存已完整时,启动 可不联网;若仍从 Hub 校验元数据,需保证网络或配置镜像/代理 |
二、启动服务(推荐)
在仓库根目录执行(请先 conda activate 到你安装了 vLLM 的环境):
cd /path/to/python # 本仓库根目录,例如 ~/Documents/code/python
chmod +x scripts/serve_qwen3_32b.sh # 仅需首次
# 默认:GPU0,监听 0.0.0.0:8000,模型 Qwen/Qwen3-32B(从 HF 缓存加载)
./scripts/serve_qwen3_32b.sh
启动成功后,HTTP API 根地址为:
http://<本机IP>:8000/v1
Chat Completions 示例路径:POST http://127.0.0.1:8000/v1/chat/completions。
三、常用环境变量(可选)
在运行 serve_qwen3_32b.sh 前通过 export 覆盖默认值:
| 变量 | 默认值 | 含义 |
|---|---|---|
CUDA_VISIBLE_DEVICES |
0 |
使用的 GPU 编号 |
MODEL |
Qwen/Qwen3-32B |
Hugging Face 仓库 ID 或 本地权重目录(含 config.json 等) |
SERVED_MODEL_NAME |
Qwen/Qwen3-32B |
客户端请求里填的 model 名称,需与业务配置一致 |
HOST |
0.0.0.0 |
监听地址 |
PORT |
8000 |
监听端口 |
MAX_MODEL_LEN |
16384 |
最大上下文长度;显存紧张可改为 8192 |
GPU_MEMORY_UTILIZATION |
0.92 |
vLLM GPU 显存占用比例 |
HF_ENDPOINT |
(官方 Hub) | 国内可尝试 https://hf-mirror.com |
PROXY_SETUP_SCRIPT |
无 | 代理脚本路径,source 后需导出 http_proxy/https_proxy |
SKIP_HF_DOWNLOAD_CHECK |
未设置 | 若必须与 hf download 同时跑(不推荐),设为 1 跳过检查 |
代理示例(与你在 shell 中的 proxy_on 一致):
proxy_on && ./scripts/serve_qwen3_32b.sh
指定 GPU 与端口:
CUDA_VISIBLE_DEVICES=0 PORT=8001 ./scripts/serve_qwen3_32b.sh
完全离线目录(不从 Hub ID 解析):
export MODEL=/你的路径/Qwen3-32B
export SERVED_MODEL_NAME=Qwen/Qwen3-32B
./scripts/serve_qwen3_32b.sh
四、与本项目 main.py 对接
main.py 通过环境变量读取 LLM 地址与模型名(见文件顶部 LLM_BASE_URL、LLM_MODEL、LLM_API_KEY)。
在项目根目录的 .env 中增加或修改为:
LLM_BASE_URL=http://127.0.0.1:8000/v1
LLM_MODEL=Qwen/Qwen3-32B
LLM_API_KEY=EMPTY
然后:
python main.py
说明:本地 vLLM 通常不校验 API Key,但 OpenAI SDK 要求传入非空字符串,使用 EMPTY 即可。
五、命令行快速验证(curl)
curl -s http://127.0.0.1:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-32B",
"messages": [{"role": "user", "content": "用一句话介绍你自己。"}],
"max_tokens": 256
}'
六、Python(OpenAI SDK)调用示例
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="EMPTY")
r = client.chat.completions.create(
model="Qwen/Qwen3-32B",
messages=[{"role": "user", "content": "你好"}],
)
print(r.choices[0].message.content)
七、后台运行与日志(可选)
nohup ./scripts/serve_qwen3_32b.sh > vllm_qwen3_32b.log 2>&1 &
tail -f vllm_qwen3_32b.log
停止服务:
pkill -f 'vllm serve'
# 若有残留 EngineCore,再执行:pgrep -af VLLM
八、重新下载或更新权重(可选)
仅在需要重新拉取 Hub 文件时使用;不要与正在运行的 vLLM 同时进行。
proxy_on # 如需代理
./scripts/download_qwen3_32b.sh
可按需设置:HF_ENDPOINT、MAX_WORKERS(网络不稳时用 1)、REPO(默认 Qwen/Qwen3-32B)。
九、重要注意事项
- 不要并行:同一台机器、同一 HF 缓存下,不要同时运行
hf download(同一模型)与vllm serve,否则会争抢~/.cache/huggingface/hub/.locks/,表现为长时间Still waiting to acquire lock。脚本已做启动前检查;务必先停其一再启另一。 - Qwen3 推理格式:服务使用
--reasoning-parser qwen3,便于分离思考链与最终回复;调用方式仍为标准 Chat Completions。 - 超时:
main.py里call_llm_with_retry默认timeout=20,本地大模型首 token 可能较慢,可按需调大。
十、脚本位置一览
| 脚本 | 作用 |
|---|---|
scripts/serve_qwen3_32b.sh |
启动 vLLM OpenAI 兼容 HTTP 服务 |
scripts/download_qwen3_32b.sh |
仅下载模型到 HF 缓存(网络差时先下载再 serve) |
如有环境与脚本不一致(例如 vLLM 版本过旧不支持 qwen3 解析器),请以当前安装的 vllm serve --help 为准调整参数。
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh
关闭服务指令:
fuser -k 8001/tcp
MacBook打通ssh端口
ssh -N -L 8001:127.0.0.1:8001 tecent-lab-server
十一、监听原理解释
你现在的服务在监听什么
serve_qwen3_32b.sh 里默认是 HOST=0.0.0.0、PORT=8001,含义是:
- 在本机 所有网卡 上监听
8001 - 同一台物理机/虚拟机上的 其他系统用户(只要他们能访问你的 IP),都可以用
http://<你的机器IP>:8001访问 OpenAI 兼容接口(例如POST .../v1/chat/completions) - 仅
127.0.0.1时才是「只有本机当前用户走 localhost」;0.0.0.0已经是「对外网卡开放」
所以:不一定要端口转发,同一局域网里别人直接用你的 内网 IP + 8001 就行(前提是防火墙放行)。
「其他虚拟用户」常见是哪几种
| 场景 | 含义 | 典型用法 |
|---|---|---|
| 同一 Linux 多用户 | 别人 SSH 登录同一台机 | 他们用 http://<服务器内网IP>:8001/v1 或 http://127.0.0.1:8001(仅当他们的进程跑在你这台机上且服务在本机监听) |
| 同一台机上的容器/另一张网卡 | 网络命名空间不同 | 要用 宿主机在该网络上的 IP,不是容器里的随机 IP(除非你做端口映射) |
| 不在同一台机、但能 SSH 到你这台机 | 同事笔记本 → 你的服务器 | SSH 本地端口转发(最常见) |
| 公网访问 | 家里/机房没有直连 | frp / cloudflared / SSH -R / 云厂商负载均衡 等 |
端口转发「实现方式」是什么(最常用:SSH)
别人电脑上执行(把访问你机器上的 8001 映射到他本机):
ssh -N -L 8001:127.0.0.1:8001 你的用户名@你的服务器IP
Then 他在自己浏览器/脚本里用:http://127.0.0.1:8001/v1,请求会通过 SSH 隧道进到你服务器,再到你本机的 vLLM。
你要保证:vLLM 在服务器上监听的是 127.0.0.1:8001 或 0.0.0.0:8001。
若只监听 127.0.0.1,只有本机直连;SSH -L 连到你的 SSH 登录会话所在机器时,一般访问的是 服务器上的 127.0.0.1,是可以的。
若你用 0.0.0.0:8001,隧道目标写 127.0.0.1:8001 仍然正确(本机回环上的服务)。
怎么「测试是否满足」
- 本机:
curl http://127.0.0.1:8001/v1/models - 同一局域网另一台机器:
curl http://<你的服务器局域网IP>:8001/v1/models- 不通 → 查 防火墙(
firewalld/iptables/ufw)是否放行 8001
- 不通 → 查 防火墙(
- 模拟「虚拟用户」走转发:用任意第二台机(或用手机热点另一台电脑)做上面的 SSH -L,再在第二台机
curl http://127.0.0.1:8001/v1/models
调用方式和你在本机一样:base_url = http://...:8001/v1,model = Qwen/Qwen3-32B,与 test.py / main.py 一致。
安全提醒(对外或多人用时必看)
- 当前 没有鉴权 时,任何能连上该端口的人都能用你的 GPU;至少应:防火墙仅对白名单 IP 开放,或前面加 反向代理 + API Key,或 只允许 SSH 隧道、不把 8001 暴露公网。
- Qwen3 思考模式会拉长响应;给别人用时注意
timeout和max_tokens
一句话:
别人能用你的模型的条件是:网络能到你的 HOST:PORT,且防火墙放行;端口转发只是把这条路径「接到另一台机器的本机端口上」,最省事的做法是 SSH -L,测试时用 curl /v1/models 从另一环境访问 即可验证。
如果你说的「虚拟用户」特指 Docker 里多个容器,需要说明你端口映射方式(-p),我可以按那种拓扑单独画一条访问路径(Ask 模式下我只能文字说明;若要改脚本绑定地址再切 Agent 模式)。
mac 自己主机访问方法
(base) kipley@Mac ~ % ssh -N -L 8001:127.0.0.1:8001 tecent-lab-server
ssh -N -L 8001:127.0.0.1:8001 tecent-lab-server
服务器其他虚拟账户访问
首先查看我当前虚拟账户的IP是多少:
hostname -I
(base) root@d58125c354a4:~/Documents/code/python# hostname -I
172.17.0.13
同事使用的方式:
同一服务器容器访问我的大模型服务:
地址:http://172.17.0.13:8001/v1
模型名:Qwen/Qwen3-32B
API密钥:EMPTY
使用指令测试是否连通模型服务:
curl http://172.17.0.13:8001/v1/models
测试代码如下:
from openai import OpenAI
# 同事容器内固定填写这个配置
client = OpenAI(
base_url="http://172.17.0.13:8001/v1", # 你的容器内网地址
api_key="EMPTY", # 固定密钥
)
# 调用接口
response = client.chat.completions.create(
model="Qwen/Qwen3-32B",
messages=[
{"role": "user", "content": "请写一段Python代码示例"}
]
)
# 输出结果
print(response.choices[0].message.content)
六、大模型内网转公网HTTPS安全接入 配置笔记
整体架构
内网容器 vLLM:8001
↓ Autossh 加密反向隧道
公网云服务器 127.0.0.1:18001
↓ 独立Nginx + HTTPS + 密钥鉴权
公网统一入口:https://llm.litearch.cn/v1
核心规则:
- 公网只开放 80、443、22,严禁放行 8001/18001
- 子域名
llm.litearch.cn独立Nginx配置,不与博客混用 - 博客GitHub Action自动构建不影响LLM接口配置
一、公网云服务器配置(ubuntu@VM-0-10-ubuntu)
1. 域名解析
域名:litearch.cn
新增A记录:
- 主机记录:
llm - 解析地址:云服务器公网IP
- 已备案子域名无需额外备案
2. SSL证书申请
sudo certbot --nginx -d llm.litearch.cn
证书自动续期,无需手动维护。
3. Nginx 独立站点配置
配置文件路径:/etc/nginx/sites-available/llm-service
server {
listen 443 ssl;
server_name llm.litearch.cn;
ssl_certificate /etc/letsencrypt/live/llm.litearch.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/llm.litearch.cn/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 接口访问鉴权密钥
if ($http_authorization != "Bearer LITEARCH_LLM_2026_SAFE_KEY") {
return 401;
}
location / {
proxy_pass http://127.0.0.1:18001;
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 60s;
proxy_read_timeout 120s;
}
}
server {
listen 80;
server_name llm.litearch.cn;
return 301 https://$host$request_uri;
}
启用配置:
sudo ln -s /etc/nginx/sites-available/llm-service /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
4. 解决Nginx域名冲突
清理 litearch.conf 中所有 llm.litearch.cn 多余server块,只保留主博客域名配置,避免端口域名冲突。
5. 安全组/防火墙规则
仅放行:
- 22 :SSH运维
- 80 :HTTP证书验证、自动跳转
- 443 :HTTPS公网接口
禁止放行:18001、8001
二、内网模型容器配置(root@d58125c354a4)
1. vLLM 启动命令(任意路径可执行)
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh
服务监听:127.0.0.1:8001
2. 内网容器免密登录云服务器
# 生成密钥
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
# 推送公钥到云服务器免密
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@llm.litearch.cn
3. 永久反向隧道(断线自动重连)
# 安装工具
apt install autossh -y
# 启动反向隧道:内网8001 → 云机本地18001
autossh -M 0 -N -R 127.0.0.1:18001:127.0.0.1:8001 ubuntu@llm.litearch.cn
关闭旧隧道:
pkill -f autossh
三、连通性测试命令
1. 云服务器本地测试隧道
curl http://127.0.0.1:18001/v1/models
2. 公网接口测试
curl -X POST https://llm.litearch.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer LITEARCH_LLM_2026_SAFE_KEY" \
-d '{
"model": "Qwen/Qwen3-32B",
"messages": [{"role": "user", "content": "你好"}]
}'
四、接入调用配置
基础信息
- 接口地址:
https://llm.litearch.cn/v1 - 模型名称:
Qwen/Qwen3-32B - API Key:
EMPTY
Python 调用示例
from openai import OpenAI
client = OpenAI(
base_url="https://llm.litearch.cn/v1",
api_key="EMPTY"
)
response = client.chat.completions.create(
model="Qwen/Qwen3-32B",
messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
五、安全强制规范
- 绝不对外放行 18001/8001 端口,只走443 HTTPS
- 所有公网接口必须加
Bearer密钥鉴权 - 同事仅接口调用,无云服务器/内网服务器SSH账号权限
- 子域名独立Nginx配置,不混入博客配置,避免被GitHub Action覆盖
- SSH禁用密码登录、改端口、仅密钥登录,防爆破
六、日常运维常用命令
- 重启LLM服务(内网服务器端):
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh - 重启隧道(云服务端):
pkill -f autossh && autossh -M 0 -N -R 127.0.0.1:18001:127.0.0.1:8001 ubuntu@llm.litearch.cn - Nginx检查重载(云服务端):
sudo nginx -t && sudo systemctl reload nginx - 查看隧道进程(云服务端):
ps aux | grep autossh
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com