文章目录
- [1 先唠唠为啥LM Studio下模型慢得抠脚](#1 先唠唠为啥LM Studio下模型慢得抠脚)
-
- [1.1 那些年我们集体踩过的坑](#1.1 那些年我们集体踩过的坑)
- [2 动手之前先把准备工作做足](#2 动手之前先把准备工作做足)
-
- [2.1 先确认你的网能直连镜像](#2.1 先确认你的网能直连镜像)
- [2.2 你需要的工具](#2.2 你需要的工具)
- [2.3 先测好两个关键IP](#2.3 先测好两个关键IP)
- [3 第一步:整一套本地证书](#3 第一步:整一套本地证书)
- [4 第二步:把证书装对地方](#4 第二步:把证书装对地方)
-
- [4.1 装进系统根证书](#4.1 装进系统根证书)
- [4.2 给Node单独配置信任](#4.2 给Node单独配置信任)
- [5 第三步:写劫持代理脚本](#5 第三步:写劫持代理脚本)
- [6 第四步:改hosts文件](#6 第四步:改hosts文件)
- [7 第五步:先验证再开LM Studio](#7 第五步:先验证再开LM Studio)
-
- [7.1 curl简单测一下](#7.1 curl简单测一下)
- [7.2 用Node再测一遍](#7.2 用Node再测一遍)
- [8 第六步:给LM Studio做好配置](#8 第六步:给LM Studio做好配置)
-
- [8.1 改设置文件](#8.1 改设置文件)
- [8.2 旧下载任务注意](#8.2 旧下载任务注意)
- [8.3 可选:用启动脚本更稳](#8.3 可选:用启动脚本更稳)
- [9 想一劳永逸就整个开机自启](#9 想一劳永逸就整个开机自启)
- [10 怎么判断真的走通了](#10 怎么判断真的走通了)
- [11 踩坑总结:最容易翻车的10个点](#11 踩坑总结:最容易翻车的10个点)
- [12 最后整个检查清单](#12 最后整个检查清单)

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
1 先唠唠为啥LM Studio下模型慢得抠脚
很多人用LM Studio下大模型,速度常年稳定在几百KB,下一个14B模型能从白天下到半夜。
更气人的是,你开了代理、改了设置,速度纹丝不动,仿佛你的操作对它来说就是空气。
核心原因很简单:LM Studio是Electron套壳,下载走的是Node,根本不吃你系统那套配置。
1.1 那些年我们集体踩过的坑
第一个坑:开了系统代理就以为能加速。
醒醒,Node下载器不读Windows系统代理设置,你开了等于白开,纯纯自我感动。
第二个坑:以为开了useHFProxy就自动切国内镜像。
它只是把请求甩给了search.lmstudio.ai这个中转地址,跟hf‑mirror半毛钱关系都没有,该慢还是慢。
第三个坑:改个hosts劫持huggingface.co就完事了。
开了代理模式的话,首跳地址根本不是huggingface,你改hosts相当于拦错了人。
第四个坑:开着Clash改配置。
TUN模式一开,DNS直接被接管,你hosts写得再明白也没用,人家直接绕路走了。
2 动手之前先把准备工作做足
先说好,这个方案是给国内宽带用户用的,境外IP就别试了,hf‑mirror会直接拒你。
2.1 先确认你的网能直连镜像
第一步先把Clash、梯子啥的全退干净,TUN模式务必关掉。
浏览器打开hf‑mirror.com,能正常打开再说下一步,打不开的话这方案不适合你。
2.2 你需要的工具
管理员权限,这个是刚需,改hosts、装证书都要。
Python 3.10以上,标准库就行,不用装额外包。
OpenSSL,装了Git的话一般自带,不用单独下。
2.3 先测好两个关键IP
镜像站和CDN的IP不是一成不变的,别直接抄我文章里的,自己测一下最稳。
cmd里敲nslookup hf‑mirror.com,拿到镜像IP。
再敲nslookup us.aws.cdn.hf.co,拿到CDN IP。
测完记下来,后面所有地方都要用你自己测出来的。
3 第一步:整一套本地证书
为啥要证书?因为我们要在本机搞HTTPS劫持,没有证书浏览器和Node根本不认。
先在用户目录建个hfproxy文件夹,所有东西都丢这里,好找。
打开Git Bash,切到这个目录,先关一下路径转换,不然openssl参数会抽风。
bash
export MSYS_NO_PATHCONV=1
先生成本地CA根证书:
bash
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout ca.key -out ca.crt -days 3650 \
-subj "/CN=HfHijack Local CA"
再生成服务器私钥:
bash
openssl genrsa -out server.key 2048
重点来了,SAN配置必须写全所有域名,漏一个都不行。
别只写huggingface.co,search.lmstudio.ai必须加进去,不然握手直接失败。
新建个san.cnf文件,内容如下:
ini
subjectAltName=DNS:huggingface.co,DNS:*.huggingface.co,DNS:cdn-lfs.huggingface.co,DNS:hf.co,DNS:us.aws.cdn.hf.co,DNS:search.lmstudio.ai
最后用CA签发服务器证书:
bash
openssl req -new -key server.key -subj "/CN=huggingface.co" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 3650 -sha256 -extfile san.cnf
完事可以核对一下,确保SAN里的域名都在,别白忙活半天漏了关键域名。
4 第二步:把证书装对地方
这里有个巨坑:Windows系统认了证书没用,LM Studio的Node不认系统根证书。
两边都得配置,缺一个都白搭,我当初就在这卡了快一小时。
4.1 装进系统根证书
管理员打开PowerShell,执行这条命令:
powershell
certutil -addstore -f Root "$env:USERPROFILE\hfproxy\ca.crt"
4.2 给Node单独配置信任
加个用户环境变量NODE_EXTRA_CA_CERTS,指向我们生成的ca.crt。
powershell
reg add "HKCU\Environment" /v NODE_EXTRA_CA_CERTS /t REG_SZ /d "$env:USERPROFILE\hfproxy\ca.crt" /f
还有个容易忽略的细节:以前配过HTTP_PROXY之类的环境变量,赶紧删掉。
不然Clash一关,Node就傻乎乎去连死端口,下载全超时,你找半天都找不到原因。
powershell
reg delete "HKCU\Environment" /v HTTP_PROXY /f
reg delete "HKCU\Environment" /v HTTPS_PROXY /f
reg delete "HKCU\Environment" /v ALL_PROXY /f
改完环境变量,记得彻底关掉LM Studio再重开,不然环境变量不生效,等于白改。
5 第三步:写劫持代理脚本
这个脚本就是整套方案的核心了,在本机监听443端口,把请求偷偷改道去国内镜像。
全程本地处理,不耗代理流量,还能绕开HF的IP风控。
在hfproxy文件夹里新建hf_hijack.py,把下面代码粘进去。
注意把MIRROR_IP改成你自己测出来的镜像IP,别直接抄我这里的数值。
python
# -*- coding: utf-8 -*-
import re
import socket
import socketserver
import ssl
import threading
from pathlib import Path
BASE = Path(__file__).resolve().parent
CERT = str(BASE / "server.crt")
KEY = str(BASE / "server.key")
MIRROR_IP = "160.16.86.14" # 改成你自己测通的镜像IP
MIRROR_HOST = "hf-mirror.com"
LISTEN = ("::", 443)
server_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
server_ctx.load_cert_chain(CERT, KEY)
server_ctx.set_alpn_protocols(["http/1.1"])
upstream_ctx = ssl.create_default_context()
_HOST_RE = re.compile(rb"^(Host:\s*)([^\r\n]*)", re.MULTILINE)
_REQUEST_RE = re.compile(rb"^([A-Z]+\s+)/v1/hf-proxy/", re.MULTILINE)
def rewrite_request(head: bytes) -> bytes:
head = _REQUEST_RE.sub(rb"\1/", head, count=1)
def repl(m):
host = m.group(2).decode("ascii", "ignore").strip()
if host and host != MIRROR_HOST:
return m.group(1) + MIRROR_HOST.encode()
return m.group(0)
return _HOST_RE.sub(repl, head)
def relay(src, dst):
try:
while True:
data = src.recv(65536)
if not data:
break
dst.sendall(data)
except Exception:
pass
finally:
for s in (src, dst):
try:
s.shutdown(socket.SHUT_RDWR)
except Exception:
pass
try:
s.close()
except Exception:
pass
class Handler(socketserver.BaseRequestHandler):
def handle(self):
client = self.request
try:
buf = b""
while b"\r\n\r\n" not in buf:
chunk = client.recv(4096)
if not chunk:
return
buf += chunk
if len(buf) > 100 * 1024:
return
head, rest = buf.split(b"\r\n\r\n", 1)
head = rewrite_request(head)
raw = socket.create_connection((MIRROR_IP, 443), timeout=15)
upstream = upstream_ctx.wrap_socket(raw, server_hostname=MIRROR_HOST)
upstream.sendall(head + b"\r\n\r\n" + rest)
t = threading.Thread(target=relay, args=(client, upstream), daemon=True)
t.start()
relay(upstream, client)
t.join(timeout=2)
except Exception as e:
print(f"[ERR] {e}", flush=True)
class Server(socketserver.ThreadingTCPServer):
address_family = socket.AF_INET6
daemon_threads = True
allow_reuse_address = True
def server_bind(self):
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
super().server_bind()
if __name__ == "__main__":
srv = Server(LISTEN, Handler)
srv.socket = server_ctx.wrap_socket(srv.socket, server_side=True)
print(f"HF hijack proxy listening on {LISTEN[0]}:{LISTEN[1]}", flush=True)
srv.serve_forever()
写完先手动跑一下试试,控制台输出监听信息就说明启动成功。
要是提示443端口被占用,先查查是啥程序,IIS、别的代理工具都有可能,得先关掉占端口的程序。
6 第四步:改hosts文件
这一步就是把相关域名全部指到本机,让LM Studio的请求乖乖走进我们的代理。
管理员打开记事本,找到C:\Windows\System32\drivers\etc\hosts文件。
动手前先备份一份,别改坏了找不回来,到时候上不了网别哭。
在文件末尾加上下面这些内容,us.aws.cdn.hf.co后面的IP换成你自己测的:
# === HF hijack ===
127.0.0.1 huggingface.co
127.0.0.1 hf.co
127.0.0.1 cdn-lfs.huggingface.co
127.0.0.1 search.lmstudio.ai
13.214.85.108 us.aws.cdn.hf.co
::1 huggingface.co
::1 hf.co
::1 cdn-lfs.huggingface.co
::1 search.lmstudio.ai
# === end HF hijack ===
划重点:IPv6那四行绝对不能省!
别问我怎么知道的,当年我就是只写了IPv4,折腾俩小时速度没变,后来抓包才发现人家悄咪咪走IPv6绕跑了,合着我拦了个寂寞。
改完刷新一下DNS缓存:
cmd
ipconfig /flushdns
验证的话用ping命令,别用nslookup,那玩意儿不走hosts,测了白测。
7 第五步:先验证再开LM Studio
别着急开软件就点下载,先测一下代理通不通,省得白忙活半天。
7.1 curl简单测一下
打开Git Bash,先测普通HF地址能不能正常返回:
bash
curl --ssl-no-revoke --noproxy "*" -s -m 20 -o /dev/null -w "HTTP %{http_code}\n" \
"https://huggingface.co/gpt2/resolve/main/config.json"
返回HTTP 200就说明基础链路通了。
再测一下LM Studio的中转地址,这个才是日常下载用的:
bash
curl --ssl-no-revoke --noproxy "*" -s -m 60 -L \
-H "Range: bytes=0-8388607" -o /dev/null \
-w "HTTP %{http_code} speed=%{speed_download}\n" \
"https://search.lmstudio.ai/v1/hf-proxy/gpt2/resolve/main/pytorch_model.bin"
返回206,速度有个几MB/s,就说明镜像走通了,不是官方的龟速。
7.2 用Node再测一遍
毕竟LM Studio底层用的是Node下载,用Node测才最贴近真实环境。
PowerShell里执行这段代码,能正常返回状态和速度就OK:
powershell
$env:NODE_EXTRA_CA_CERTS = "$env:USERPROFILE\hfproxy\ca.crt"
Remove-Item Env:HTTP_PROXY,Env:HTTPS_PROXY,Env:ALL_PROXY -ErrorAction SilentlyContinue
& "$env:USERPROFILE\.lmstudio\.internal\utils\node.exe" -e @"
const https = require('https');
const url = 'https://search.lmstudio.ai/v1/hf-proxy/gpt2/resolve/main/pytorch_model.bin';
const headers = { Range: 'bytes=0-8388607' };
const t0 = Date.now();
function go(u, n=0) {
https.get(u, { headers }, res => {
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location && n < 5) {
console.log('redirect', res.statusCode, new URL(res.headers.location).hostname);
res.resume();
return go(res.headers.location, n+1);
}
let b = 0;
res.on('data', c => b += c.length);
res.on('end', () => {
const s = (Date.now()-t0)/1000;
console.log('HTTP', res.statusCode, 'bytes='+b, 'MB/s='+(b/s/1048576).toFixed(2));
});
}).on('error', e => { console.error(e); process.exit(1); });
}
go(url);
"@
8 第六步:给LM Studio做好配置
8.1 改设置文件
找到用户目录下.lmstudio文件夹里的settings.json,把useHFProxy改成false。
当然设成true也能用,关掉更稳妥,少一层中转速度理论上更快。
放心,我们的代理两种模式都兼容,不怕它来回跳地址。
8.2 旧下载任务注意
已经开始的下载任务,URL会存在download‑jobs‑info.json里。
不用手动去改文件,我们的代理会自动处理/v1/hf‑proxy前缀,直接恢复下载就行。
8.3 可选:用启动脚本更稳
怕环境变量不生效的,可以整个启动脚本,每次用脚本开LM Studio,双重保险。
新建个start_lms_hijack.ps1,下面的安装路径改成你自己的:
powershell
$rules = 'MAP search.lmstudio.ai 127.0.0.1, MAP huggingface.co 127.0.0.1, MAP hf.co 127.0.0.1, MAP cdn-lfs.huggingface.co 127.0.0.1, MAP us.aws.cdn.hf.co 13.214.85.108, EXCLUDE localhost'
Get-Process -Name 'LM Studio' -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep -Seconds 2
$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = 'D:\AI\LLM\LM Studio\LM Studio.exe' # 改成你的LM Studio安装路径
$startInfo.UseShellExecute = $false
$startInfo.Arguments = '--host-resolver-rules="' + $rules + '" --disable-features=UseDnsHttpsSvcbAlpn,AsyncDns'
$startInfo.EnvironmentVariables['NODE_EXTRA_CA_CERTS'] = "$env:USERPROFILE\hfproxy\ca.crt"
$startInfo.EnvironmentVariables.Remove('HTTP_PROXY')
$startInfo.EnvironmentVariables.Remove('HTTPS_PROXY')
$startInfo.EnvironmentVariables.Remove('ALL_PROXY')
[System.Diagnostics.Process]::Start($startInfo) | Out-Null
9 想一劳永逸就整个开机自启
总不能每次下模型都手动开代理,整个开机自启,后台偷偷跑,不占视线也不打扰干活。
Win+R输shell:startup打开启动文件夹。
新建个vbs文件,内容如下,Python路径改成你自己的绝对路径:
vbs
Set shell = CreateObject("WScript.Shell")
shell.Run """C:\Path\To\pythonw.exe"" ""C:\Users\你的用户名\hfproxy\hf_hijack.py""", 0, False
用pythonw就是后台运行,不会弹个黑框框在任务栏,清爽得很。
10 怎么判断真的走通了
别光看速度自我感动,教你三招实锤是不是真的走了国内镜像。
第一招:看连接地址。
PowerShell里查LM Studio的TCP连接,远程地址是127.0.0.1或者你测的CDN IP,就对了。
要是看到172.67开头、104.26开头,或者IPv6是2606:4700开头,那还在走官方Cloudflare,白折腾了。
第二招:看速度。
走通了基本都是几MB到十几MB每秒,还停留在几百KB的,铁定没走对路子。
第三招:看日志。
去LM Studio的日志文件夹看main.log,证书错了会直接报错。
要是下了一会儿才超时,多半是代理环境变量的锅,不是证书问题。
11 踩坑总结:最容易翻车的10个点
我把自己踩过的、网友踩过的坑全列在这,避开这些成功率直接拉到99%。
-
只劫持huggingface.co,忘了search.lmstudio.ai,开了代理模式直接失效。
-
只改IPv4的hosts,IPv6没管,人家直接走IPv6绕路了,你拦了个寂寞。
-
开着Clash/TUN改配置,DNS被接管,hosts改了也白改。
-
把CDN域名也指到127.0.0.1,大文件没必要走本地代理,还会证书不匹配。
-
证书SAN漏了域名,握手阶段直接被Node拒绝,连都连不上。
-
只装了系统证书,忘了给Node配环境变量,两边不同步等于白装。
-
以前的代理环境变量没删,关了梯子就全超时,排查半天找不到原因。
-
直接抄文章里的IP,镜像和CDN IP会变,当天用当天测才靠谱。
-
人在境外还硬用,hf‑mirror会封非国内IP,别白费力气。
-
用nslookup验证hosts,它不走hosts,测了半天测了个寂寞。
12 最后整个检查清单
动手前对着勾一遍,一步都别漏,省得回头返工:
✅ Clash/TUN完全退出
✅ 宽带能直连hf‑mirror.com
✅ 测好了当前可用的镜像IP、CDN IP
✅ 生成了CA和带全域名SAN的服务器证书
✅ CA装进了系统根证书
✅ 配置了NODE_EXTRA_CA_CERTS环境变量
✅ 删掉了旧的HTTP_PROXY等环境变量
✅ 代理脚本正在监听443端口
✅ hosts里IPv4和IPv6都配全了
✅ CDN域名指向了真实IP,不是127.0.0.1
✅ curl和Node测试都正常返回
✅ 彻底重启了LM Studio
全部勾完再点下载,基本稳了。
以后下模型再也不用熬大夜盯着进度条了。
P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。