一句话定义:分片权重文件(sharded weight files)是把一个模型的全部参数拆成多个文件分别存储,再用一个索引文件(index)把它们对应起来的一套权重保存方式。你下载到的往往是一堆 xxx-00001-of-00005 之类的文件加一个 *.index.json,这些都算它。
为什么必须拆
大模型的参数量可以用“亿”甚至“千亿”来计,权重存下来动辄几十到上百 GB。如果把这么大的数据全放进一个文件,会立刻遇到几个麻烦:上传和下载中途断了就得从头再来;很多对象存储和文件系统对单文件大小有限制;加载时一次性读进内存,机器很可能承受不了。
打个比方:宜家送来的不是一整张装好的沙发,而是若干纸箱,外加一张装箱单。装箱单不装任何零件,只告诉你“螺丝在第 2 箱、靠背在第 4 箱”。分片权重文件就是这个结构:序号文件是纸箱,索引文件是装箱单。加载器先读索引,知道每个参数(tensor)落在哪个分片,再逐个打开分片,把参数按名称对应回模型结构里,模型就组装好了。索引文件里通常维护一张从参数名到分片文件名的映射表,所以它本身很小,但缺少它就完全没法加载。
和相邻概念的区别
| 分片权重文件 | 单个权重文件 | 量化权重文件 | |
|---|---|---|---|
| 解决什么问题 | 文件太大、不好传不好存 | —— | 数值太占显存和体积 |
| 是否改变参数数值 | 否,只是切分 | 否 | 是,降低精度 |
| 少一个会怎样 | 直接加载失败 | —— | —— |
还有两个常见混淆点:一是 checkpoint,那指的是“训练到某一时刻保存下来的存档”这个时间概念,分片只是它采用的物理存储形式;二是训练时的分布式切分(把参数分散到多张卡上计算),那是为了分摊算力,而存储分片主要是为了文件本身便于上传下载,两者可能同时出现,但解决的问题不同。
对从业者的实际意义
第一,下载必须整套。缺一个分片,或者索引里记录的文件名和硬盘上的对不上,加载就会报错,典型表现是找不到某个分片,或者参数名缺失。第二,不要随手改文件名,序号和索引是配套的。第三,做离线部署或打包镜像时,要按“所有分片相加”来估体积,并留足磁盘余量和解压空间。第四,下载完按官方提供的校验信息核对一遍,残缺的文件往往要到加载那一刻才暴露。具体格式规范和校验方式,以官方页面为准。
一句话记住:模型权重是一个拼图,分片是拼块,索引是那张告诉你哪块放哪儿的图纸。
