序
最近在玩ComfyUI的时候受到了下载模型的强烈痛苦,网上找了一圈也没有找到称心如意的工具,直接用代理下载大模型的话,流量很快就会告急...,而huggingface-cli和hf-transfer也各有各的问题。
为什么不使用huggingface-cli和HF-Ttransfer
为什么不使用huggingface-cli和HF-Ttransfer
下载huggingface上的大模型一般用
huggingface-cli可以较快的下载,但是经过自测也只能占满下行带宽的10%~20%,但是huggingface的CDN服务器不是太稳定(因为有时你分配到的边缘节点很慢),这会影响huggingface-cli的下载速度。所以本脚本的目的是通过自建cloudflare workers来代理huggingface服务器进行并行下载。HF-Ttransfer的下载速度比原版huggingface-cli要快很多,但是经常会卡住、且无法中断,如果强行中断会丢失数据从零开始。
最后自己想了个办法,通过aria2可以多源下载的特点,在多个开源脚本的基础上自己糊了一个脚本,实现了满速下载大模型,具体细节请看这里。这里主要记录一下cloudflare woker脚本的部署方法。
需要准备的东西
- 注册一个cloudflare账号
- 白嫖或者买一个域名,因为cloudflare的域名DNS污染很严重,最好是用自己的域名,再说现在域名也不贵。
- 如果域名不是在cloudflare上购买的,就需要从其他域名服务商转移到cloudflare,让cloudflare来托管域名。cloudflare的DNS修改是真的快,用了之后再也回不去了。
开始
首先要先登录cloudflare,进入cloudflare的dashboard面板,选择Workers和Pages:

在概述页面点击创建:

点击创建worker:

这里名字可以随便填,如果要创建多个就r1,r2这样的名字即可,填了之后你就会获得一个worker.dev的三级域名,不过因为我们要用自己的域名,所以无所谓。

填了名字后直接点击部署,cloudflare会先创建一个默认的hello world脚本。
创建好后会进入woker详情页面,此时选择编辑代码进入脚本编辑器:


现在到去这里下载worker.js,把其中的内容复制出来,粘贴到编辑器中,或者直接将下面的内容复制进去:
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run "npm run dev" in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run "npm run deploy" to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const specialCases = {
"*": {
"Origin": "DELETE",
"Referer": "DELETE"
}
}
function handleSpecialCases(request) {
const url = new URL(request.url);
const rules = specialCases[url.hostname] || specialCases["*"];
for (const [key, value] of Object.entries(rules)) {
switch (value) {
case "KEEP":
break;
case "DELETE":
request.headers.delete(key);
break;
default:
request.headers.set(key, value);
break;
}
}
}
async function handleRequest(request) {
const url = new URL(request.url);
if (url.pathname === "/") {
return new Response("Please enter the link after the /")
};
const actualUrlStr = url.pathname.replace("/", "") + url.search + url.hash;
const actualUrl = new URL(actualUrlStr);
const modifiedRequest = new Request(actualUrl, {
headers: request.headers,
method: request.method,
body: request.body,
redirect: 'follow'
});
handleSpecialCases(modifiedRequest);
const response = await fetch(modifiedRequest);
const modifiedResponse = new Response(response.body, response);
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
}

然后点击右上角部署。
部署成功后点击左上角r5(你刚刚填的名字)返回上一页,选择设置栏,在域和路由处点击添加:

在弹出的侧边栏选择自定义域,填写你托管在cloudflare上的域名,起一个二级域名的名字,比如r5.yourdomain.com。

结束
此时你的代理域名就搭建好了,你可以这样使用:
https://r5.yourdomain.com/https://xxx.com/file.zip
下载速度还可以,至少有好几Mb/s。
如果只使用一个代理服务器的速度肯定还是很慢,如何使用aria2实现多个源服务器并行下载,请参考我糊的这个脚本。
更多内容请关注我的博客