跳到主要内容

认识

2025年02月09日
柏拉文
越努力,越幸运

一、认识


TFJS 中,一个完整的模型通常包含:

  • model.json: 模型结构、权重路径等元数据(数据流图和权重清单文件)

  • group1-shard\*of\*: 二进制权重文件的集合

模型分片(Model Sharding 是将 model.json 中的 group1-shard1.bin 二进制权重文件分为多个小片,利用浏览器的并发请求能力,更快的加载模型, 这种方式减少单个文件的大小,提高并行加载能力和缓存效率。我们可以基于 tensorflowjs_converter 对模型中的 group1-shardXofY.bin 进行分片,并且可以通过 --weight_shard_size_bytes 分片大小。为什么要进行模型分片 Model Sharding: 1. 提高加载速度, 多个小文件可以利用浏览器的并发请求能力并行下载,比一个大文件下载更快; 2. 减少浏览器限制, 部分浏览器对大文件的下载、缓存或解析 有限制; 3. HTTP/2 多路复用支持并行请求多个小文件; 4. Service Worker 缓存策略更友好; 5. 降低内存占用, 部分设备一次性加载大模型会内存溢出,分片可减少一次性加载的内存消耗。

二、准备


1. 下载 tensorflow/tensorflow 镜像

docker pull --platform tensorflow/tensorflow:2.10.0

2. 运行 tensorflow/tensorflow 容器

docker run -it --rm tensorflow/tensorflow:2.10.0 bash

3. 安装 tensorflow==2.0.0 tensorflowjs

pip install tensorflow==2.0.0 tensorflowjs

4. 将本地模型发送到 Docker 容器

docker cp /path/to/my_model.h5 <container_id>:/tmp/layers_model/model.json

三、分片


tfjs_layers_model 格式的 model.json 中的 group1-shard1of1.bin 文件分片,每片最大为 200 KB

tensorflowjs_converter --input_format=tfjs_layers_model --output_format=tfjs_layers_model --weight_shard_size_bytes=200000 /tmp/layers_model/model.json /tmp/layers_model/shared_model