LM Studio下载模型慢到崩溃?本地HTTPS劫持直连hf‑mirror提速方案

文章目录

  • [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%。

  1. 只劫持huggingface.co忘了search.lmstudio.ai,开了代理模式直接失效。

  2. 只改IPv4的hosts,IPv6没管,人家直接走IPv6绕路了,你拦了个寂寞。

  3. 开着Clash/TUN改配置,DNS被接管,hosts改了也白改。

  4. 把CDN域名也指到127.0.0.1,大文件没必要走本地代理,还会证书不匹配。

  5. 证书SAN漏了域名,握手阶段直接被Node拒绝,连都连不上。

  6. 只装了系统证书,忘了给Node配环境变量,两边不同步等于白装。

  7. 以前的代理环境变量没删,关了梯子就全超时,排查半天找不到原因。

  8. 直接抄文章里的IP,镜像和CDN IP会变,当天用当天测才靠谱。

  9. 人在境外还硬用,hf‑mirror会封非国内IP,别白费力气。

  10. 用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的朋友,否则看看零散的博文就够了。

相关推荐
数字新视界2 小时前
2026模块化机房选型指南:行业市场发展趋势、占有率与竞争梯队分析报告解析
大数据·人工智能·物联网·数据中心·微模块机房·模块化机房·冷通道
米小虾2 小时前
一周 AI 观察:模型层在"周更",钱却全流进了机房
人工智能
Dawson Zhu2 小时前
从单体到联邦:多Agent架构的必要性与设计哲学
人工智能·语言模型·架构·aigc·agi
火山引擎开发者社区2 小时前
AgentKit 实战|搭建一个有记忆、懂业务、会执行的智能客服
人工智能
商业看点解说2 小时前
企业需要为大模型应用设置安全护栏,推荐使用哪些生成式AI平台?
人工智能·安全
ai小陈2 小时前
LoRA微调显存怎么估?32GB GPU训练配置与常见问题排查
人工智能·深度学习·机器学习·ai·gpu算力
论文复现现场3 小时前
ComfyUI部署MiniMax H3:8G本地卡、RTX 4090和RTX 5090怎么选?
人工智能·云计算·音视频·gpu算力
腾视科技-AI3 小时前
超低功耗 性能卓越|腾视科技重磅推出TS-SG-SM9系列AI算力模组,引领边缘智能计算新篇章!
人工智能·科技·ai·ai算力模组·ai模组·腾视科技·ai算力盒
政企项目老覃3 小时前
大模型幻觉治理与自动评测:金融风控场景的落地实践
人工智能·算法·机器学习