在 Windows 上把 lev 跑起来
前提:显卡10G显存, 系统里已有uv。目标是本机加载发布权重interfaze-ai/lev,提供http://127.0.0.1:8000/v1/systemone。
官方docs/SETUP.md把本机限定成跑测试,把 GPU 服务放在 Modal 的 H100 上。下面的镜像、CUDA 轮子和离线启动,是这台机器上实际走通的路径,不在那份文档里。
装好的是lev(Qwen3.5-4B + LoRA)。权重落在用户目录的 Hugging Face 缓存:基座约 8.7GB,适配器约 170MB。
1. 进入仓库再装依赖
所有命令都在仓库目录里执行。在C:\Users\123里跑uv,用的不是这个项目的.venv,会报找不到torch。
cd D:\work\opensource\lev uv sync--extra serveserve额外依赖会装上 torch、transformers 和 HTTP 服务。
2. CUDA 版 PyTorch
驱动是 610.88,对应 CUDA 13.0 的官方轮子,大约 1.9GB:
cd D:\work\opensource\lev uv pip install--reinstall"torch==2.14.0"--index-url https://download.pytorch.org/whl/cu130 uv run python-c"import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"成功时打印:
2.14.0+cu130 True NVIDIA GeForce RTX 5070hardlink 警告可以忽略,不影响使用。
3. 用镜像下载权重
机器访问huggingface.co如果超时(WinError 10060),https://hf-mirror.com可以打开。适配器里大约 171MB 的文件默认走 Xet(cas-server.xethub.hf.co),镜像对这个地址返回 401。关掉 Xet,让它走普通下载。
这两个变量只对当前 PowerShell 窗口有效:
$env:HF_ENDPOINT ="https://hf-mirror.com"$env:HF_HUB_DISABLE_XET ="1"uv run lev serve--checkpoint interfaze-ai/lev--port 8000第一次启动会下载 Qwen3.5-4B 基座(约 8GB)和interfaze-ai/lev的 LoRA。下载完之前服务不会就绪。Windows 缓存若提示无法创建 symlink,只是警告,不是退出原因。
缓存目录:
%USERPROFILE%\.cache\huggingface\hub\models--Qwen--Qwen3.5-4B%USERPROFILE%\.cache\huggingface\hub\models--interfaze-ai--lev
4. 权重已在本地时,离线启动
基座和适配器都下完之后,启动仍可能向hf-mirror.com发确认请求。这个请求超时后会重试(Retry 1/5),五次都失败服务就退出。停掉这次启动(Ctrl+C),改用缓存:
cd D:\work\opensource\lev$env:HF_HUB_OFFLINE ="1"$env:HF_ENDPOINT ="https://hf-mirror.com"$env:HF_HUB_DISABLE_XET ="1"uv run lev serve--checkpoint interfaze-ai/lev--port 8000等到日志里出现这两行再发请求:
Application startup complete Uvicorn running on http://127.0.0.1:8000Waiting for application startup是在把约 8GB 权重读进显卡,第一次比 CPU 启动更久。
bf16 权重大约 8GB,腾出显存后再开。
浏览器打开http://127.0.0.1:8000时日志里的404是正常的:这个服务没有网页,也没有favicon.ico。
5. 确认服务
另开一个 PowerShell 窗口:
Invoke-RestMethodhttp://127.0.0.1:8000/health应返回status为ok。然后发一条决策:
$body= @{state ="Hi, I was charged twice for my order #4471 and I want a refund."questions = @{intent = @{type="choice"instructions ="What does the customer want?"criteria = @{refund ="wants money back";cancel =$null;track =$null;other =$null}}urgent = @{type="noul";instructions ="Does this need a human within the hour?"}}}|ConvertTo-Json-Depth 6Invoke-RestMethodhttp://127.0.0.1:8000/v1/systemone-Method Post-Body$body-ContentType"application/json"发请求的窗口可以关掉。留着uv run lev serve的那个窗口,按Ctrl+C才会停服务。
choice返回选中的选项名和confidence。noul是「是」的概率,越接近 1 越倾向于是。score从0 档起算,是各档下标的概率加权平均,不是百分制。
若请求要等很久,而nvidia-smi里没有这个进程、GPU 利用率是 0%,说明还在用 CPU 版 PyTorch。回到第 2 步换成+cu130,再重启服务。
6. 发中文
ConvertTo-Json再交给Invoke-RestMethod时,中文可能不是 UTF-8。用字节发送:
functionAsk-Lev($state,$questions){$json= @{state =$state;questions =$questions}|ConvertTo-Json-Depth 8$bytes=[System.Text.Encoding]::UTF8.GetBytes($json)$r=Invoke-RestMethodhttp://127.0.0.1:8000/v1/systemone-Method Post-Body$bytes-ContentType"application/json; charset=utf-8"$r.answers.PSObject.Properties|ForEach-Object{$a=$_.Valueswitch($a.type){"choice"{"{0}: {1} (confidence {2:N2})"-f$_.Name,$a.choice,$a.confidence}"noul"{"{0}: P(yes)={1:N2}"-f$_.Name,$a.noul}"score"{"{0}: {1:N2} (confidence {2:N2})"-f$_.Name,$a.score,$a.confidence}}}""}Ask-Lev"每次打开设置应用就崩溃。安卓 14,昨天更新之后开始的。"@{team = @{type="choice";instructions ="这个问题该由哪个团队处理?";criteria = @{billing ="账单和退款";technical ="程序故障";account ="账号和登录"}}bug = @{type="noul";instructions ="这是不是一个程序故障报告?"}severity = @{type="score";instructions ="严重程度如何?";criteria = @("只是外观问题","有替代办法","功能用不了","应用完全无法使用")}}发布说明把适用范围写成英文:微调和校准数据来自英文任务。基座能读中文,但这些概率没有在中文上校准过。短句路由可以试,不能当成中文评测。严重度四档是 0 外观、1 有替代办法、2 功能用不了、3 完全无法使用,所以2.27不是满分 5 里的 2.27 分。
下次启动
权重已经在缓存里时,只需要:
cd D:\work\opensource\lev$env:HF_HUB_OFFLINE ="1"$env:HF_ENDPOINT ="https://hf-mirror.com"$env:HF_HUB_DISABLE_XET ="1"uv run lev serve--checkpoint interfaze-ai/lev--port 8000先确认仍是 CUDA 版:
uv run python-c"import torch; print(torch.__version__, torch.cuda.is_available())"应是2.14.0+cu130 True。若变回+cpu,重做第 2 步,不要先uv sync。
和官方文档的对应关系
| 这里用的命令 | 出处 |
|---|---|
uv sync --extra serve | Makefile的setup-serve;packages/lev/src/lev/release.py |
lev serve --checkpoint interfaze-ai/lev --port 8000 | 根目录README.md的 Quickstart。原文还有--host 0.0.0.0 |
uv run | 依赖在仓库的.venv里,不在系统 Python 里 |
docs/TRAINING.md里同一条uv sync --extra serve后面跟的是未微调基座Qwen/Qwen3.5-4B,不是发布权重。本机要跑的是--checkpoint interfaze-ai/lev。
系列文章:
判断模型SystemOne的对比, lev、Jev、JevK5、decider、laya 与 kev