BitaHub 模型部署实践:本地下载、文件系统上传与 GPU 挂载

在 BitaHub 算力平台下载模型时,利用 200GB 的免费文件存储空间,通过本地下载、命令行文上传和 GPU 实例挂载降低模型准备成本的完整流程。

BitaHub彼塔云GPURTX 4090Hugging FaceModelScopehf模型下载模型部署模型推理

整体思路

之前使用 AutoDL 较多,最近开始使用 BitaHub 彼塔云(一个提供 A100 和 RTX 4090 的算力平台),该平台 RTX 4090 卡资源较多,且价格稍微便宜些。

对我来说,使用这类算力平台主要是部署和测试各种开源模型,例如 Qwen3.8-27B-Uncensored-GGUF、Qwen-Image-2.1 、Comfy-Org/MiniMax-H3 等。

此类场景都有一个必要的流程:模型下载,模型权重文件体积基本在几十 GB 左右,比如:

如果每次都是:启动 GPU 实例,下载模型,等待几十 GB 文件下载完成,然后再开始推理,那么前面消耗的时间仅仅是下载,而用不到 GPU 的算力,但是这个下载过程却要消耗 GPU 费用,有点不划算。

AutoDL 有一个好的地方是:当不需要使用 GPU 场景时,可以关机后使用无卡模式,无卡模式使用 0.5 核;2GB 内存;无 GPU 卡的配置,价格统一为¥0.1/小时,对实例之前和之后的数据均无影响,具体参见:AutoDL 省钱绝招。

BitaHub 彼塔云 没有提供该功能,不过提供了独立的文件存储功能,可利用该功能将模型下载到本地,然后上传到 BitaHub 的文件存储中,再从文件存储中挂载模型,这样就可以避免下载模型时消耗 GPU 费用。

核心原则很简单:

能在 GPU 实例启动之前完成的事情,就不要占用 GPU 时间。

算力与存储

BitaHub 彼塔云 提供 RTX 4090 24GB、NVIDIA A100 80GB 以及 CPU 等不同类型的计算资源,并提供单卡和多卡规格。

我目前主要使用的是 RTX 4090 24GB,以我使用时平台显示的信息为例:

资源规格 / 价格
RTX 409024GB VRAM
4090 单卡¥1.68 / 小时
实例内存56GB
GPU 规格1 / 2 / 4 / 8 卡
A10080GB VRAM
A100 单卡¥6.38 / 小时

这些是目前平台实时显示的资源和价格,实际使用时应以创建实例页面显示的信息为准。

开发机提供的免费系统盘容量为 30GB,最大只能设置 100GB,多出的 70GB 系统盘 0.07元/日/GB 合计 ¥ 4.90 /日,且无论是否关机。

因此存放模型最好使用平台提供的文件存储,每个用户有 200GB 免费存储额度,超出部分按照 ¥0.01 /GB/日 收费,对于个人用户来说,200GB 已经可以同时存放多套模型。

纯文本
Qwen-Image-2.1                         ≈ 33 GB
MiniMax-H3 相关量化模型及组件             ≈ 70 GB
Qwen3.8-27B Uncensored GGUF Q5         ≈ 22 GB
------------------------------------------------
合计                                    ≈ 125 GB

剩余空间还可以继续放 VAE、Text Encoder、LoRA 或其他文件。把大模型权重放在独立文件系统中,再按需挂载到 GPU 实例是合适的使用方式。

模型准备流程

实际使用下来,固定为下面的流程:

纯文本
1. 确认需要部署的模型
        ↓
2. 优先检查 ModelScope (国内访问速度很快)
        ↓
3. ModelScope 没有,再检查 Hugging Face (一些 Uncensored 模型,ModelScope 通常不会提供)
        ↓
4. 下载到本地指定目录
        ↓
5. 在 BitaHub 创建文件系统(初次)
        ↓
6. 在 BitaHub 创建模型,需要先创建一个文件系统
        ↓
7. 使用 bita CLI 上传到指定的模型
        ↓
8. 创建 GPU 开发环境
        ↓
9. 挂载文件系统/模型
        ↓
10. 开始推理

这样真正开始 GPU 计费之前,几十 GB 甚至上百 GB 的模型文件已经全部准备好了。

需要注意:账号超6个月未登录且余额为0,或账号欠费超过15天,平台将对账号数据进行清理。

工具

本地主要需要三个命令行工具:

  • hf:下载 Hugging Face Hub 上的模型;

  • modelscope:下载 ModelScope 魔搭社区中的模型;

  • bita:将本地模型上传到 BitaHub 的命令行快传工具。

Hugging Face CLI

huggingface_hub Python 包附带了内置命令行工具:hf,该工具允许直接在终端和 Hugging Face Hub 进行交互,比如:登录、创建仓库、上传下载等。

安装

  • macOS 和 Linux
Bash
curl -LsSf https://hf.co/cli/install.sh | bash
  • Windows
Bash
powershell -ExecutionPolicy ByPass -c "irm https://hf.co/cli/install.ps1 | iex"

安装包会同时安装全局hf-cli skill,供任何读取 ~/.agents/skills 目录的 agent 使用。使用 --exclude-skill 参数可以避免安装:

Bash
# macOS 和 Linux
curl -LsSf https://hf.co/cli/install.sh | bash -s -- --exclude-skill
 
# Windows
powershell -ExecutionPolicy ByPass -c "& ([scriptblock]::Create((irm https://hf.co/cli/install.ps1))) -ExcludeSkill"

使用

下载命令基本结构:

Bash
hf download <repo-id> [files...] --local-dir <directory>
  • 下载整个仓库到指定目录:
Bash
hf download Qwen/Qwen-Image-2.1 --local-dir ~/MyFiles/models/Qwen-Image-2.1
  • 下载单个文件到指定目录:
Bash
hf download JonathanColetti/Qwen3.8-27B-Uncensored-GGUF Qwen3.8-27B-Uncensored-Q5_K_M.gguf --local-dir ~/MyFiles/models/Qwen3.8-27B-Uncensored-GGUF
  • 一次下载多个指定文件,GGUF 仓库常见,提供 IQ2、Q4、Q5、Q6、Q8 等大量量化版本,实际只需要其中一个匹配 GPU 显存的主模型和辅助文件,无需整个仓库:
Bash
hf download JonathanColetti/Qwen3.8-27B-Uncensored-GGUF \
  Qwen3.8-27B-Uncensored-Q5_K_M.gguf \
  Qwen3.8-27B-Uncensored-draft-Q4_0.gguf \
  Qwen3.8-27B-Uncensored-draft-Q8_0.gguf \
  mmproj-Qwen3.8-27B-Uncensored-F16.gguf \
  --local-dir ~/MyFiles/models/Qwen3.8-27B-Uncensored-GGUF
  • --include按照 Glob Pattern 选择需要的文件:
Bash
hf download <repo-id> --include "*.json" "*.safetensors" --local-dir ./models/model-name/
  • 使用 --exclude,如果大部分文件都需要,只想排除某些内容,例如一个仓库同时提供 .safetensors 和 .bin 权重,而只需要 safetensors,就可以直接排除 .bin:
Bash
hf download <repo-id> --exclude "*.bin" --local-dir ./models/model-name/

若要准备上传到 BitaHub 彼塔云 必须使用 --local-dir,若直接执行:

Bash
hf download <repo-id>

Hugging Face 默认使用自己的 Hub Cache 结构,文件通常位于:

Bash
~/.cache/huggingface/hub/

通过软连接指向实际的文件,这种结构是 Hugging Face 默认的缓存结构,但如果目标是上传到远端服务器,则不太适合文件组织。

Bash
tree -l models--mobiuslabsgmbh--faster-whisper-large-v3-turbo
models--mobiuslabsgmbh--faster-whisper-large-v3-turbo
├── blobs
│   ├── 0351d1d6870005e865747b781b5d7c23ea0459cd
│   ├── 0adcd01e7c237205d593b707e66dd5d7bc785d2d
│   ├── 17456db595adc78a973f97d69d8cb50bc87c0b1c
│   ├── 931c77a740890c46365c7ae0c9d350ba3cca908f
│   └── e76620f83d5f5b69efd3d87e3dc180c1bd21df9fbebacfd4335e5e1efcc018da
├── refs
│   └── main
└── snapshots
    └── 0a363e9161cbc7ed1431c9597a8ceaf0c4f78fcf
        ├── config.json -> ../../blobs/0351d1d6870005e865747b781b5d7c23ea0459cd
        ├── model.bin -> ../../blobs/e76620f83d5f5b69efd3d87e3dc180c1bd21df9fbebacfd4335e5e1efcc018da
        ├── preprocessor_config.json -> ../../blobs/931c77a740890c46365c7ae0c9d350ba3cca908f
        ├── tokenizer.json -> ../../blobs/17456db595adc78a973f97d69d8cb50bc87c0b1c
        └── vocabulary.json -> ../../blobs/0adcd01e7c237205d593b707e66dd5d7bc785d2d
 
5 directories, 11 files

最好是直接指定:

Bash
# ~/models/<model-name>/ 为本地路径
--local-dir ~/models/<model-name>/

这样得到的目录结构基本就是模型仓库本身的结构,更方便检查、打包、上传以及后续直接加载。

需要注意的是,当前 Hugging Face 即使使用 --local-dir,也会在目标目录创建一个 .cache/huggingface/ 元数据目录,用于判断文件是否需要重新下载。

模型下载完成并确认不再需要同步更新后,这个元数据目录可以删除。

ModelScope CLI

需要使用 ModelScope SDK 来下载模型,官方文档

安装

Bash
pip install -U modelscope
# 确认安装成功
modelscope --version

使用

ModelScope 的逻辑与 Hugging Face 非常接近,命令行下载基本格式:

Bash
modelscope download --model <model-id> --local_dir <directory>

两者参数命名略有不同:

纯文本
Hugging Face    --local-dir
ModelScope      --local_dir

一个是 -,一个是 _。

  • 默认下载位置: ~/.cache/modelscope/hub,若要调整,需要设置环境变量:MODELSCOPE_CACHE,macOS 在 ~/.zshrc 中添加:
Bash
export MODELSCOPE_CACHE=/path/to/your/cache
  • <model_id> 模型 ID,从模型首页获取,由组织名称和模型名称组成,如:Qwen/Qwen-Image-2.1;

  • 下载私有模型需要登陆;

  • 下载整个仓库到指定目录:

Bash
modelscope download --model Qwen/Qwen-Image-2.1 --local_dir /path/to/your/models/
  • 下载单个文件到指定目录:
Bash
modelscope download --model Qwen/Qwen-Image-2.1 README.md --local_dir /path/to/your/models/
  • 下载多个指定文件,文件名可以直接依次写在后面:
Bash
modelscope download \
  --model <model-id> \
  README.md \
  model_index.json \
  --local_dir /path/to/your/models/
  • 使用 --include,按照 Glob Pattern 选择需要的文件:
Bash
modelscope download \
  --model <model-id> \
  --include "*.safetensors" \
  --local_dir /path/to/your/models/

也可以指定多个 Pattern:

Bash
modelscope download \
  --model <model-id> \
  --include "*.json" "*.safetensors" \
  --local_dir ./models/model-name/
  • 使用 --exclude,如果大部分文件都需要,只想排除某些内容,例如一个仓库同时提供 .safetensors 和 .bin 权重,而只需要 safetensors,就可以直接排除 .bin:
Bash
modelscope download \
  --model <model-id> \
  --exclude "*.bin" \
  --local_dir /path/to/your/models/
  • 参数:
参数简写类型默认值说明
repo_id-str-位置参数,仓库 ID(可选,也可通过 --model 指定)
files-str-位置参数,指定要下载的文件(支持多个)
--model-strNone模型 ID(与 --dataset 互斥)
--dataset-strNone数据集 ID(与 --model 互斥)
--repo-type-choicemodel仓库类型(model/dataset),与位置参数 repo_id 配合使用
--revision-strNone版本/分支/tag
--cache_dir-strNone缓存目录
--local_dir-strNone本地目录(优先于 cache_dir)
--include-listNone包含的文件 glob 模式
--exclude-listNone排除的文件 glob 模式
--token-strNone访问令牌(私有模型需要)
--endpoint-strNoneModelScope 服务端点
--max-workers-int默认最大并发下载线程数

BitaHub CLI

BitaHub 提供 Windows、Linux、macOS Intel 和 macOS Apple Silicon 对应版本的 bita 客户端,我使用的是 macOS Apple Silicon,安装完成后确认:

Bash
bita --help

BitaHub 官方建议 macOS 在安装前确保 /usr/local/bin/ 存在,之后安装对应架构的 .pkg 即可。

Bash
mkdir -p /usr/local/bin/

模型准备完成后,就可以上传到 BitaHub,首先需要在 BitaHub 的 文件存储 中创建文件系统。

对于几十 GB 的模型,不建议直接使用浏览器上传。BitaHub 官方也建议,当单个文件超过 10GB、文件数量很多,或者需要从本地终端上传时,使用 bita 命令行快传工具。

  1. 登录:
Bash
bita login -e https://www.bitahub.com

CLI 使用浏览器授权方式,终端会显示授权地址和一次性授权码,在浏览器中完成授权即可,不需要直接在终端输入账号密码。

  1. 获取上传命令:

进入 BitaHub 的 存储管理 页面,选择对应的文件系统,点击 上传 按钮,页面会自动生成类似:

Bash
bita upload \
  -e https://www.bitahub.com \
  -b <bucket-id> \
  -o / \
  -l <本地文件或文件夹路径>

其中:

纯文本
-e    BitaHub 平台地址
-b    当前文件系统对应的 bucket id
-o    上传到文件系统中的目标目录
-l    本地文件或文件夹路径

实际使用时,bucket-id 不用手动输入,直接复制 BitaHub 当前上传页面生成的命令最稳妥。

挂载并运行模型

先把所有准备工作完成:

纯文本
本地模型下载完成
        ↓
文件系统创建完成
        ↓
模型上传完成
        ↓
BitaHub 模型创建完成

全部准备完成之后,再创建 GPU 开发环境。

BitaHub 官方提供的模型部署流程也是先把模型上传到文件系统,再从这些文件创建模型,最后在创建开发环境时挂载对应模型。

创建开发环境时,在 存储挂载 中选择之前创建好的文件系统或者模型。模型挂载后,可以直接从容器中的挂载目录读取模型文件,比如:

Bash
/oceanz/models/Qwen/Qwen-Image-2.1

实际路径取决于创建模型时使用的名称和挂载配置,之后代码直接使用本地路径加载即可,例如:

Python
pipe = QwenImage21Pipeline.from_pretrained(
    "/oceanz/models/Qwen/Qwen-Image-2.1",
    torch_dtype=torch.bfloat16,
    local_files_only=True
)

对于 llama.cpp 的 GGUF:

Bash
llama cli -m /oceanz/models/Qwen/Qwen3.8-27B-Uncensored/Qwen3.8-27B-Uncensored-Q5_K_M.gguf

如果是视觉模型,再挂载对应的 multimodal projector:

Bash
llama cli -m /oceanz/models/Qwen/Qwen3.8-27B-Uncensored/Qwen3.8-27B-Uncensored-Q5_K_M.gguf  --mmproj /oceanz/models/Qwen/Qwen3.8-27B-Uncensored/mmproj-Qwen3.8-27B-Uncensored-F16.gguf

这样 GPU 实例启动之后,基本可以直接开始环境配置和推理,不再需要等待几十 GB 模型下载。

暂无目录