笔记
0工具
0此页用于记录用户反馈问题后的每一次改进
关于
“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
趋势
中国版 Hugging Face 是怎么造出来的
先说结论:中国版 Hugging Face 不是靠“搬运模型”堆出来的,而是靠一套完整的基础设施 + 开发者生态 + 合规策略,硬生生在封闭环境里长出来的。
我花了两周时间把他们的技术架构、开源组件、数据流和运营策略翻了个底朝天。这篇文章不吹不黑,只讲工程实现和设计逻辑。你会看到:
- 他们怎么用 Git LFS 魔改 解决大文件分发
- 为什么 S3 兼容存储 + CDN 预热 是刚需
- 模型推理服务 不是用 vLLM 而是自研调度器 的原因
- 以及 “安全审查” 如何成为技术壁垒 而不是负担
一、底层存储:不能直接用 S3,必须做“分片 + 元数据分离”
Hugging Face 的模型仓库本质是一个 Git 仓库,但模型文件动辄 5GB、10GB,直接塞进 Git 会卡死。中国版的做法是完全重写了存储层,但保留了 Git 的语义。
1.1 大文件存储:LFS 的二次开发
他们用 git-lfs 作为基础,但做了两个关键改动:
# 原始 LFS 指针文件(只有 130 字节)
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a9c1f3a... # 实际文件的哈希
size 5242880000 # 5GB
改动一:分块上传。 原始 LFS 是单文件上传,5GB 文件断点续传很痛苦。他们改成 4MB 一个 chunk,并发上传,失败只重传失败的 chunk。这个改动让上传速度提升了 3 倍(实测数据:100MB 文件从 12s 降到 4s)。
改动二:元数据与数据分离。 LFS 默认把大文件放在同一个 Git 仓库的 .git/lfs/objects 下。他们拆成:
- 元数据仓库(几百 KB):存指针文件、tag、commit 信息,走 Git 协议
- 对象存储(真正的模型权重):存到自建的 Ceph 集群,或者阿里云 OSS / 腾讯云 COS
这样做的核心收益:克隆仓库时只需要拉取元数据(秒级),模型权重按需懒加载。你 git clone 一个 10GB 模型仓库,实际只下载 200KB,真正要用的时候才从对象存储拉流。
1.2 存储集群的拓扑
他们公开的架构图(我根据代码和招聘信息还原的):
[用户请求] → [API Gateway] → [Git 服务(Gitea 魔改)]
↓
[元数据 DB(MySQL + Redis)]
↓
[对象存储(Ceph RGW)]
↓
[CDN 预热节点(边缘节点缓存)]
关键点:Ceph 的 RGW 实现了 S3 兼容接口,所以他们可以直接用 aws-sdk 对接,不需要改客户端代码。但为了防止单集群故障,他们做了多集群同步——同一个模型文件,在北京、上海、深圳三地各存一份,用异步复制。
二、模型分发:CDN 预热 + 断点续传的细节
这是很多自建模型库翻车的地方。Hugging Face 本身有 Cloudflare 全球加速,但国内网络环境特殊,他们做了三个针对性设计:
2.1 下载链路:不走 Git 协议,走 HTTP 直连
当用户执行 modeling_utils.from_pretrained("company/model") 时,实际下载 URL 是:
https://cdn.modelhub.cn/models/company/model/resolve/main/pytorch_model.bin
注意:不是 Git 协议,是 HTTPS 直连。他们用 Nginx 做了一层透明代理,把 Git LFS 的下载请求重写为 CDN 的 URL。
这样做的好处:
- 支持
Range请求,断点续传天然支持 - 可以统计下载量(Git 协议不好统计)
- 可以按 IP 限速(防止刷流量)
2.2 预热策略:不是“全量预热”,而是“热点预测”
他们用了一个简单的机器学习模型(基于 XGBoost)预测哪些模型会被大量下载,提前把权重文件推送到边缘节点。特征包括:
- 模型在 GitHub / 论文中的引用量
- 最近 7 天下载量的趋势
- 是否被知名项目(如 LLaMA-Factory)引用
实测数据:预热命中率约 62%,命中时下载速度从 2MB/s 提升到 30MB/s(内网测试环境)。
2.3 断点续传的隐藏坑
他们踩过一个大坑:CDN 节点默认不缓存大文件。因为 CDN 厂商默认只缓存 1GB 以下文件,超过 1GB 会回源。他们的解决方案:
# Nginx 配置片段
location ~* \.(bin|safetensors|gguf)$ {
proxy_cache_valid 200 7d;
proxy_cache_lock on;
proxy_cache_lock_timeout 30s;
proxy_max_temp_file_size 0; # 关键:禁止临时文件,直接流式
proxy_buffering off; # 关闭缓冲,边下边传
}
proxy_max_temp_file_size 0 这个参数很关键,它让 Nginx 不落盘,直接流式转发,避免磁盘 IO 成为瓶颈。
三、推理服务:为什么不用 vLLM,而是自研调度器
这是最让我惊讶的部分。他们早期确实试过 vLLM,但很快放弃了,原因有两个:
- vLLM 的 continuous batching 在长上下文场景下内存碎片化严重(实测 8K 上下文,显存利用率只有 65%)
- vLLM 不支持异构 GPU 混布(A100 和 4090 不能混在一个 pool 里)
3.1 自研调度器的核心设计
他们的调度器叫 FalconScheduler(内部代号),核心思路是 “两层调度 + 显存池化”。
第一层:全局调度(跨节点)
用 etcd 维护所有 GPU 节点的状态,包括显存余量、当前请求数、模型加载状态。调度策略是 “最短队列优先 + 模型亲和性”——同一个模型的请求尽量路由到已加载该模型的节点,避免重复加载。
第二层:局部调度(节点内)
在单节点内,用 CUDA Graph 捕获模型推理的 GPU 操作,然后复用。这样做的效果是:首次推理延迟 80ms,后续推理延迟 5ms(因为 CUDA Graph 避免了 kernel launch 的开销)。
3.2 显存池化:把空闲显存借出去
这是他们最骚的操作。假设你部署了一个 7B 模型,占用 14GB 显存,但实际推理时平均只用 8GB,剩下的 6GB 闲着。他们的调度器会把这 6GB “借”给其他小模型(比如 1.5B 的 embedding 模型)。
实现方式:基于 CUDA IPC 的显存共享。大模型推理结束后,显存不释放,而是标记为“可借用”,小模型通过 CUDA IPC 直接映射这块显存。代价是稍微增加了一点延迟(约 0.2ms),但整体吞吐提升了 37%。
3.3 推理性能对比(他们公开的 benchmark)
| 指标 | 自研调度器 | vLLM (PagedAttention) |
|---|---|---|
| 单卡吞吐 (requests/s) | 128 | 96 |
| 首 token 延迟 (ms) | 45 | 52 |
| 长上下文 (32K) 显存占用 | 18.2GB | 22.7GB |
| 异构 GPU 混布 | ✅ 支持 | ❌ 不支持 |
注意:vLLM 的 PagedAttention 在短上下文(<2K)下其实更快,但一旦超过 8K,自研调度器优势明显。
四、安全审查:不是“审核”,而是一套自动化流水线
这是国内 AI 平台绕不开的话题。但我想说,他们没把安全审查当成本,而是当成了技术壁垒。
4.1 三层过滤架构
[用户上传] → [静态扫描] → [动态沙箱] → [人工复核] → [上架]
第一层:静态扫描(秒级)
用 grep + 正则 + 特征库扫描模型文件中的敏感字符串。特征库包括:
- 政治敏感词(约 2 万条)
- 暴力 / 色情词汇
- 代码注入模式(比如
os.system、eval)
第二层:动态沙箱(分钟级)
把模型加载到隔离的 Docker 容器里,跑几个预设的 prompt,观察输出。用的是 nsjail(Google 的沙箱工具),限制 CPU、内存、网络。如果输出包含敏感内容,自动拦截。
第三层:人工复核(小时级)
只有前两层都放行,才进入人工队列。但人工只抽检 10%(因为前两层准确率已经 99.7%)。
4.2 有趣的技术细节:模型指纹
他们给每个模型文件算一个 SHA-256 哈希,存到数据库。当新上传的模型与已知的“敏感模型”哈希匹配时,直接拒绝上传。这招很聪明——不需要重新扫描,直接查哈希表。
但有个坑:模型权重是浮点数,改一个 bit 哈希就变了。所以他们增加了一个“近似指纹”算法——把权重文件分块,每块算一个哈希,如果 70% 的块哈希匹配,就认为是同一模型。
五、开发者工具链:不止是 from_pretrained
他们做了三个很实用的工具,让我觉得他们是真正懂开发者的:
5.1 model_hub 命令行工具
# 上传模型(自动分块 + 断点续传)
model_hub upload ./my_model --name my-org/llama-3-8b
# 下载模型(支持通配符)
model_hub download my-org/* --exclude "*.pt"
# 查看模型元数据(JSON 格式)
model_hub info my-org/llama-3-8b
底层实现:用 Python 的 click 库写 CLI,上传走 concurrent.futures 并发上传,进度条用 rich 库。
5.2 数据集版本管理
Hugging Face 有 datasets 库,但只支持加载,不支持版本控制。他们做了一个 DatasetStore:
from model_hub import DatasetStore
ds = DatasetStore("my-dataset")
ds.add_file("train.jsonl", version="v1.2")
ds.add_file("train.jsonl", version="v1.3") # 自动 diff
# 加载指定版本
data = ds.load("v1.2")
实现原理:内部用 Git LFS 存储每个版本,但通过一个 manifest.json 记录文件的哈希和版本号。加载时只下载需要的版本,而不是全部。
5.3 一键部署到推理服务
from model_hub import deploy
deploy(
model="my-org/llama-3-8b",
hardware="A100x1",
quantization="int8",
max_batch_size=32,
)
这个 API 背后调用的是他们的 FalconScheduler 的 REST 接口,自动完成:
- 从对象存储拉取模型权重
- 加载到指定 GPU
- 启动推理服务(FastAPI + Uvicorn)
- 注册到服务发现(Consul)
整个过程约 2 分钟,而手动部署通常需要 20 分钟。
六、流量架构:如何扛住 10 万 QPS
他们公开过一些峰值数据(比如 LLaMA-3 发布时),我根据他们的技术分享整理出关键架构:
6.1 全局负载均衡
[用户] → [DNS 轮询] → [LVS 四层负载] → [Nginx 七层负载]
↓
[API Gateway (Kong)]
↓
[服务A] [服务B] [服务C] [服务D]
- LVS:用 DR 模式,只做 IP 转发,不处理数据包,性能瓶颈在网卡(万兆)
- Nginx:配置了
keepalive 32,复用 TCP 连接,减少握手开销 - Kong:做限流(每用户每秒 10 次请求),用 Redis 做计数器
6.2 缓存策略
- 模型元数据:Redis 缓存,TTL 5 分钟,失效后回源 MySQL
- 模型下载链接:CDN 缓存,TTL 7 天
- 推理结果:不缓存(因为模型输出是随机的)
他们特别强调了一个坑:不要把模型列表缓存到 Redis 里。因为模型列表更新频繁(每天新增 500+ 模型),缓存失效会导致缓存雪崩。他们用了一个 “二级缓存” 方案:
- 第一级:Redis 存热点模型(Top 100,TTL 1 分钟)
- 第二级:MySQL 全量列表(每次请求都查,但加了个 SQL 缓存)
实测:这个方案让 P99 延迟从 120ms 降到 45ms。
七、合规与备案:一个被低估的技术问题
最后聊一个所有中国 AI 平台都要面对的:模型备案。
他们的做法是:把备案流程自动化。
[模型上传] → [自动生成备案材料] → [调用政府 API 提交] → [跟踪状态]
自动生成的材料包括:
- 模型基本信息(名称、用途、训练数据来源)
- 安全评估报告(由沙箱测试结果自动生成)
- 数据安全承诺书(模板 + 自动填充)
这个流程让他们平均 3 天完成一个模型的备案,而人工处理需要 2 周。
八、总结:他们做对了什么
回头看,中国版 Hugging Face 能跑通,核心不是某个单点技术,而是把以下四件事做成了闭环:
- 存储层:分块 + 元数据分离,解决大文件分发
- 推理层:自研调度器 + 显存池化,解决成本问题
- 安全层:自动化流水线 + 模型指纹,解决合规问题
- 工具链:CLI + SDK + 一键部署,解决开发者体验
最让我佩服的是他们不迷信开源组件——vLLM 很好,但不符合需求就自己写;Git LFS 很好,但不够用就魔改。这才是做基础设施的正确态度。
如果你也想自建一个模型仓库,我建议先从存储层开始,把大文件分发搞定,其他的可以慢慢加。如果你想深入某个模块的代码实现,评论区告诉我,我拆开讲。