ModelScope Hub 模块详解:模型仓库管理、快照下载与云端部署 API 实战
【免费下载链接】modelscopeModelScope: bring the notion of Model-as-a-Service to life.项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope
ModelScope Hub 是 ModelScope 中面向"模型即服务(Model-as-a-Service)"理念的仓库层,统一封装了模型与数据集的创建、上传、下载、版本管理与云端部署能力。本文以 docs/source/api/modelscope.hub.rst 公开的 API 清单为主线,结合modelscope/hub/目录下的源码实现,系统讲解HubApi、Repository、ServiceDeployer、snapshot_download、model_file_download五大核心 API 的用法、参数与底层原理,帮助你掌握在 ModelScope 生态中完成"模型发布—拉取—部署"全链路的标准姿势。
Hub 模块的整体定位与架构
从源码结构看,modelscope/hub/__init__.py是一个典型的"兼容层(shim layer)":它对外保留modelscope.hub的历史公共面(CommitScheduler、ProgressCallback、TqdmCallback、snapshot_download),而真实逻辑委托给独立的modelscope_hub包。这一点在 modelscope/hub/api.py 的模块注释中写得很明确:
单一职责:薄兼容层。所有真实逻辑位于
modelscope_hub.compat.LegacyHubApi与modelscope_hub.config.HubConfig。
因此在阅读本文时你会发现两条线索:
- 对外 API 形态:
from modelscope.hub import ...的导入方式、位置参数签名与旧版完全一致,老代码无需改动; - 内部实现:
HubApi.__getattr__会把未命中的属性透明代理到内部modelscope_hub.HubApi(见 modelscope/hub/api.py),保证新能力自动"长"到旧接口上。
模块还在导入时做了环境变量桥接(_sync_config,见 modelscope/hub/init.py):
MS_CACHE_HOME:旧版缓存目录别名,若设置且未设置MODELSCOPE_CACHE,会同步到HubConfig.cache_dir;MODELSCOPE_CREDENTIALS_PATH:覆盖凭据目录,若指向一个credentials文件,则取其父目录作为配置目录。
modelscope.hub模块由文档列出的五个核心 API 及一批辅助模块组成,下表是它们的映射关系:
| 文档公开 API | 实现文件 | 职责 |
|---|---|---|
api.HubApi | modelscope/hub/api.py | 模型仓库增删查、文件/目录上传、OSS 数据集管理、凭据管理 |
repository.Repository | modelscope/hub/repository.py | 以 Git 方式克隆/推送模型与数据集仓库 |
deploy.ServiceDeployer | modelscope/hub/deploy.py | 将模型部署到云端(当前支持 PAI EAS) |
snapshot_download.snapshot_download | modelscope/hub/snapshot_download.py | 整仓快照下载(含数据集) |
file_download.model_file_download | modelscope/hub/file_download.py | 单文件下载与底层 HTTP 下载器 |
登录与凭据管理:ModelScopeConfig
所有涉及私有仓库、上传和部署的操作都需要登录凭据。ModelScopeConfig(位于 modelscope/hub/api.py)负责凭据的读写,其默认凭据目录为~/.modelscope/credentials,可用环境变量MODELSCOPE_CREDENTIALS_PATH覆盖(常量定义见 modelscope/hub/constants.py)。
凭据目录中维护四类文件(对应 modelscope/hub/api.py):
| 文件名 | 含义 | 相关方法 |
|---|---|---|
cookies | 登录 Cookie,用于私有资源访问 | save_cookies/get_cookies |
git_token | Git 访问令牌,用于 git push 鉴权 | save_git_token/get_git_token |
user | 用户名:邮箱用户信息 | save_user_info/get_user_info |
session | 稳定会话 ID,用于 User-Agent | get_user_session_id |
常用登录与配置方法(均为静态方法):
from modelscope.hub.api import ModelScopeConfig # 保存 Git 令牌(推荐方式,旧 save_token 已标记 Deprecated) ModelScopeConfig.save_git_token('你的令牌') # 保存用户信息(用户名:邮箱) ModelScopeConfig.save_user_info('your_name', 'your_email@example.com') # 构建携带 SDK 版本、Python 版本与会话 ID 的 User-Agent ua = ModelScopeConfig.get_user_agent({'task': 'text-generation'})其中get_user_agent会拼接modelscope/<版本>; python/<版本>; session_id/<会话>; platform/<平台>; env/<环境>; user/<用户名>,并支持传入字典或字符串追加自定义字段。环境名与用户名分别取自环境变量MODELSCOPE_ENVIRONMENT(默认custom)与MODELSCOPE_USERNAME(默认unknown),见 modelscope/hub/api.py。
HubApi:模型仓库操作的核心入口
HubApi是文档公开的第一个核心 API,继承自modelscope_hub.compat.LegacyHubApi。其构造函数(见 modelscope/hub/api.py)接受四个参数:
from modelscope.hub.api import HubApi api = HubApi( endpoint=None, # 服务端点,默认取 get_endpoint()(国内站 www.modelscope.cn) timeout=90, # 单 socket 超时秒数,默认 90 max_retries=5, # HTTP 最大重试次数,默认 5 token=None, # 访问令牌 )端点与超时的默认值来源于 modelscope/hub/constants.py:国内站www.modelscope.cn、国际站www.modelscope.ai;MODELSCOPE_API_HTTP_CLIENT_TIMEOUT(默认 90)与API_HTTP_CLIENT_MAX_RETRIES(默认 5)均支持环境变量覆盖。当传入非默认timeout/max_retries时,源码会立即构造内部 LegacyClient,确保自定义超时真正生效在网络请求上(见 modelscope/hub/api.py)。
创建模型仓库
# 创建模型仓库,返回仓库 URL url = api.create_model(model_id='your_name/bert-base-test')实现上create_model委托给create_repo(model 类型),并对返回 URL 中的端点做一致性替换(见 modelscope/hub/api.py)。认证失败时兼容层会将其转换为ValueError抛出。
上传文件与目录
# 上传整个目录到仓库 api.upload_folder( repo_id='your_name/bert-base-test', folder_path='./output', # 本地目录 path_in_repo='models', # 仓库内目标目录,默认根目录 commit_message='upload v2', # 提交信息 ) # 上传单个文件(file 对象或路径) api.upload_file( repo_id='your_name/bert-base-test', path_or_fileobj=open('config.json', 'rb'), path_in_repo='config.json', )upload_folder与upload_file是 HubApi 中为保持旧接口而显式保留的方法(见 modelscope/hub/api.py):它们从kwargs中剥离repo_type(默认model)与token,当传入的 token 与当前配置不同时会新建一个独立HubApi实例来执行上传。仓库类型repo_type可取model、dataset、studio(常量REPO_TYPE_*定义于 modelscope/hub/constants.py)。
查询模型地址与 OSS 数据集管理
# 返回模型主页 URL,格式为 {endpoint}/{model_id} model_url = api.get_model_url('your_name/bert-base-test') # 列出数据集 OSS 存储中的对象 objects = api.list_oss_dataset_objects( dataset_name='your_dataset', namespace='your_name', max_limit=100, is_recursive=True, is_filter_dir=False, revision='master', ) # 删除单个 OSS 对象 / 目录前缀 msg = api.delete_oss_dataset_object( object_name='data/train.jsonl', dataset_name='your_dataset', namespace='your_name', revision='master', ) msg = api.delete_oss_dataset_dir( object_name='data/', dataset_name='your_dataset', namespace='your_name', revision='master', )这三类 OSS 操作通过_legacy_request完成(见 modelscope/hub/api.py):先由 legacy client 做 HTTP 层错误处理,再对应用层{"Code": 200, ...}响应体做raise_on_error校验,成功才返回解析后的 JSON。删除接口要求四个参数全部非空,否则抛出ValueError。
元数据文件下载
fetch_meta_files_from_url(modelscope/hub/api.py)用于从 URL 拉取 CSV/JSONL 元数据文件并缓存:文件以 URL 的 MD5 命名,支持DownloadMode.REUSE_DATASET_IF_EXISTS(默认)与FORCE_REDOWNLOAD两种模式;对 JSONL 会逐行解析为 DataFrame 后追加写入 CSV,对 CSV 则原样写入,下载过程带 tqdm 进度条。
Repository:Git 式模型仓库操作
Repository(见 modelscope/hub/repository.py)把模型仓库当作本地 Git 工作区来管理,构造函数即克隆:传入model_dir与clone_from(model_id)后,若目标目录尚不是该仓库的工作副本,会自动完成 clone,并自动处理 Git LFS 安装、用户信息写入与 token 注入。
from modelscope.hub.repository import Repository repo = Repository( model_dir='./models/bert-base', clone_from='damo/nlp_structbert_sentence-similarity_chinese-base', revision='master', # 默认 DEFAULT_REPOSITORY_REVISION(master) git_token=None, # 不传则从 ModelScopeConfig 读取 git_path='git', # 自定义 git 可执行文件路径 )克隆判断逻辑在_clone_if_needed(modelscope/hub/repository.py):只有当目录非空且已有 remote URL 与目标一致时才跳过克隆,避免重复拉取。若本机未安装 Git LFS,构造函数会记录错误日志。
仓库对象的常用操作:
# 拉取远端更新(默认 origin/master) repo.pull() # 增加一种 Git LFS 跟踪的文件后缀(追加到 .gitattributes) repo.add_lfs_type('*.safetensors') # 提交并推送(已标记 Deprecated,官方建议改用 HubApi().upload_folder) repo.push(commit_message='update config', local_branch='master', remote_branch='master', force=False) # 打注解标签并推送(ModelScope 以标签作为 revision 机制) repo.tag_and_push(tag_name='v1.0', message='release v1.0')注意push与tag_and_push均要求已登录(git_token非空),否则抛出NotLoginException;tag与tag_and_push要求标签名和 message 均非空,因为"我们使用基于标签的 revision"(源码注释原文),空标签会被InvalidParameter拒绝。
配套的DatasetRepository(modelscope/hub/repository.py)面向数据集元数据仓库:仓库 URL 形如{endpoint}/datasets/{dataset_id}.git,需显式调用clone()完成克隆,push前会先pull避免冲突。
所有 Git 底层操作由GitCommandWrapper(modelscope/hub/git.py)执行,它是一个Singleton单例,把clone、pull、push、add、commit、checkout、new_branch、tag、push_tag等命令封装为方法,并负责从 URL 中注入/剥离 token(_add_git_token/remove_token_from_url)。
snapshot_download:整仓快照下载
snapshot_download用于把某个模型仓库的完整快照下载到本地,是文档公开的第四个核心 API。它在 modelscope/hub/snapshot_download.py 中保留旧版位置参数签名并委托给modelscope_hub.compat实现:
from modelscope.hub import snapshot_download local_dir = snapshot_download( model_id='damo/nlp_structbert_sentence-similarity_chinese-base', revision='master', # 版本,None 表示解析默认版本 cache_dir=None, # 缓存根目录 local_dir=None, # 直接下载到的目标目录(与 cache 二选一) allow_patterns=None, # 仅下载匹配的文件(支持列表) ignore_patterns=None, # 跳过匹配的文件 max_workers=4, # 并行下载线程数,默认 4 local_files_only=False, # 仅使用本地缓存,不联网 token=None, )几个值得注意的实现细节:
- 参数别名:
model_id与repo_id等价,repo_type默认为model,还支持dataset等其他仓库类型; - 旧缓存复用:当未指定
local_dir时,会调用find_reusable_legacy_repo_dir尝试复用旧版平铺缓存目录(见 modelscope/hub/utils/utils.py),避免重复下载; - 旧缓存探测:模块启动时会探测安装的
modelscope-hub是否支持 1.38 之前旧缓存布局的自动识别(DownloadManager._find_legacy_repo_dir,需modelscope-hub>=0.1.7),若不支持会打印一次升级提示(见 modelscope/hub/snapshot_download.py); - 进度回调:
progress_callbacks接收一组ProgressCallback子类(而非实例),每个文件下载时各实例化一次来上报进度。
数据集快照下载使用同级的dataset_snapshot_download(modelscope/hub/snapshot_download.py),签名与模型版本对齐,同样支持allow_patterns/ignore_patterns过滤与旧缓存复用。
from modelscope.hub.snapshot_download import dataset_snapshot_download ds_dir = dataset_snapshot_download( dataset_id='damo/中文闲聊数据集', # 示意:以实际存在的 dataset_id 为准 revision='master', )model_file_download:单文件下载与底层传输
当你只需要仓库中的某一个文件(如README.md或单个权重文件)时,用model_file_download更轻量(modelscope/hub/file_download.py):
from modelscope.hub.file_download import model_file_download path = model_file_download( model_id='damo/nlp_structbert_sentence-similarity_chinese-base', file_path='README.md', revision='master', # None 时自动解析发布版本 cache_dir=None, local_dir=None, # 指定则直接写入该目录 local_files_only=False, )源码中该函数在revision is None时会通过HubApi.get_valid_revision_detail按发布模式自动解析版本(基于 SDK 发布时间的_get_release_timestamp,见 modelscope/hub/file_download.py);设置环境变量MODELSCOPE_SDK_DEBUG时该解析被跳过。数据集单文件下载对应dataset_file_download(同文件 modelscope/hub/file_download.py)。
如果你需要直接拼装下载 URL 或自定义 HTTP 下载,Hub 还保留了三个底层工具:
from modelscope.hub.file_download import ( get_file_download_url, http_get_file, http_get_model_file) # 构造下载 URL:{endpoint}/api/v1/models/{model_id}/repo?Revision=...&FilePath=... url = get_file_download_url('john/bert', 'README.md', 'master') # 直接 HTTP 下载到本地文件(带重试与断点续传) http_get_file(url, local_dir='/tmp', file_name='README.md', cookies=None)http_get_file与http_get_model_file(modelscope/hub/file_download.py)是保留的非 Hub API 工具,其传输层具备完整的生产级特性:
- 断点续传:通过
Range: bytes=<已下载>-请求头续传,http_get_model_file还会校验已存在文件的长度是否达到file_size; - 指数退避重试:
API_FILE_DOWNLOAD_RETRY_TIMES = 5次重试、backoff_factor=1(退避节奏约 0.5s/1s/2s/4s),每次请求带X-Request-ID随机头; - 块大小与超时:分块 1MB(
API_FILE_DOWNLOAD_CHUNK_SIZE)、单次超时 60s(API_FILE_DOWNLOAD_TIMEOUT),均可在 modelscope/hub/constants.py 找到定义; - 完整性校验:
http_get_model_file边下载边计算 SHA-256,若发生过重试则返回None表示哈希不可信;http_get_file会核对 Content-Length 与落盘大小,不一致即删除临时文件并抛FileDownloadError。
examples/pytorch/stable_diffusion/SD推理最佳实践.ipynb中就有from modelscope.hub.file_download import model_file_download的实际调用,可作为单文件下载在推理工作流中的参考用法。
ServiceDeployer:把模型部署到云端(PAI EAS)
ServiceDeployer(modelscope/hub/deploy.py)封装了模型云端部署的完整生命周期,当前仅支持阿里云 PAI EAS(Vendor.EAS),是文档公开的第三个核心 API。构造函数要求已登录(需要 cookies):
from modelscope.hub.deploy import ( ServiceDeployer, ServiceResourceConfig, ServiceScalingConfig, EASDeployParameters, EASListParameters) deployer = ServiceDeployer(endpoint=None, token=None)资源与提供商配置
部署前需要先构造资源规格与云厂商参数(源码中使用attrs定义并带校验器):
from modelscope.hub.deploy import Accelerator, EASRegion, EASCpuInstanceType, EASGpuInstanceType # 弹性伸缩配置:min_replica 必须 ≤ max_replica(有校验器强制) scaling = ServiceScalingConfig(max_replica=1, min_replica=1) # 资源规格:accelerator 只能是 'cpu' 或 'gpu' resource = ServiceResourceConfig( instance_type=EASCpuInstanceType.tiny, # 例:'ecs.c6.2xlarge' scaling=scaling, accelerator=Accelerator.CPU, # 默认 CPU ) # EAS 部署参数:vendor 固定为 'eas',region 如 'cn-hangzhou'、'cn-beijing' provider = EASDeployParameters( region=EASRegion.hangzhou, access_key_id='你的 AccessKeyId', access_key_secret='你的 AccessKeySecret', )源码中预置的实例规格(见 modelscope/hub/deploy.py)包括:CPU 档位ecs.c6.2xlarge/ecs.c6.4xlarge/ecs.c6.6xlarge/ecs.c6.8xlarge(对应 tiny/small/medium/large),GPU 档位ecs.gn5-c28g1.7xlarge、ecs.gn5-c8g1.4xlarge、ecs.gn6i-c24g1.12xlarge、ecs.gn6e-c12g1.3xlarge。
部署生命周期操作
# 1. 创建部署(异步 API,云端部署需一定时间,建议另行查询状态) info = deployer.create( model_id='damo/nlp_structbert_sentence-similarity_chinese-base', revision='master', instance_name='my-bert-service', resource=resource, provider=provider, ) # 2. 查询单个实例 info = deployer.get(instance_name='my-bert-service', provider=provider) # 3. 列出实例(skip/limit 分页,当前后端尚不支持分页参数) instances = deployer.list(provider=provider, skip=0, limit=100) # 4. 删除实例(异步删除,可通过云控制台确认) deleted = deployer.delete(instance_name='my-bert-service', provider=provider)实现要点:
create调用POST {endpoint}/api/v1/deployer/endpoint,请求体由DeployServiceParameters(含instance_name、model_id、revision、resource、provider)序列化而来;非 EAS 厂商直接抛NotSupportError(源码注释:"Not support vendor..., only support EAS current");get/delete/list把 provider 参数经AttrsToQueryString.to_query_str转成provider=<urlencode(json)>查询串后拼接 URL(见 modelscope/hub/deploy.py);- 所有请求统一走
handle_http_response+is_ok响应包校验,失败时抛出RequestError(消息取响应Message字段)。
配套能力:定时提交、进度回调与缓存管理
除文档列出的五个核心 API 外,modelscope.hub还提供若干高频配套工具。
CommitScheduler:定时自动提交
CommitScheduler(modelscope/hub/commit_scheduler.py)可把本地目录按固定间隔自动增量上传到 Hub,适合训练过程中持续落盘日志、checkpoint 的场景。它维护last_uploaded文件 mtime 记录,只上传发生变化的文件(通过补丁_prepare_upload_folder实现增量逻辑),并自动过滤.git目录(IGNORE_GIT_FOLDER_PATTERNS)。
from modelscope.hub import CommitScheduler # 每 10 分钟把 workspace 目录增量提交到数据集仓库 my_experiments with CommitScheduler( repo_id='your_name/my_experiments', repo_type='dataset', folder_path='./workspace', path_in_repo='logs', interval=10, # 单位:分钟 visibility='public', # public / private / internal ) as scheduler: # ... 你的训练逻辑,进程退出时自动执行最终提交 pass调度器内置守护线程 + 单线程线程池,__exit__时会trigger().result()同步等待最后一次提交完成再退出,进程退出时还会通过atexit兜底提交。建议优先使用上下文管理器以保证清理与最终提交(docstring 明确推荐)。
进度回调与缓存扫描
ProgressCallback/TqdmCallback从modelscope.hub.callback导出(modelscope/hub/callback.py),用于下载进度上报;scan_cache_dir(modelscope/hub/cache_manager.py)扫描本地 Hub 缓存,输出ModelScopeCacheInfo结构化信息,支持export_as_table()表格化展示,可作为缓存清理与容量统计的基础;push_to_hub系列(modelscope/hub/push_to_hub.py)提供将本地输出目录一键推送为模型仓库的能力,支持同步/异步与任务队列两种模式。
错误模型
modelscope/hub/errors.py 定义了完整的异常层级:GitError(Git 命令失败)、NotLoginException(未登录)、InvalidParameter(参数非法)、RequestError(服务端返回业务错误)、FileDownloadError(下载不完整)以及 HTTP 状态码处理工具handle_http_response/raise_for_http_status/raise_on_error,并支持从响应中提取X-Request-ID便于排查。
常用环境变量速查
以下是modelscope.hub相关的可调环境变量(定义于 modelscope/hub/constants.py 与 modelscope/hub/init.py):
| 环境变量 | 默认值 | 作用 |
|---|---|---|
MODELSCOPE_CACHE | 平台默认缓存目录 | 缓存根目录 |
MS_CACHE_HOME | — | 旧版缓存别名,桥接到MODELSCOPE_CACHE |
MODELSCOPE_CREDENTIALS_PATH | ~/.modelscope/credentials | 凭据目录 |
MODELSCOPE_API_HTTP_CLIENT_TIMEOUT | 90 | HubApi HTTP 单 socket 超时(秒) |
API_HTTP_CLIENT_MAX_RETRIES | 5 | HubApi HTTP 最大重试次数 |
MODELSCOPE_PARALLEL_DOWNLOAD_THRESHOLD_MB | 500 | 并行下载阈值(MB) |
MODELSCOPE_DOWNLOAD_PARALLELS | 1 | 下载并行度 |
MODELSCOPE_ENVIRONMENT/MODELSCOPE_USERNAME | custom/unknown | User-Agent 中的环境与用户标识 |
MODELSCOPE_SDK_DEBUG | 未设置 | 置位后跳过发布版本解析(开发模式) |
典型工作流串讲
把上述 API 组合起来,即可覆盖"训练 → 发布 → 拉取 → 部署"的完整链路:
- 训练产出并发布:用
HubApi().create_model创建仓库,upload_folder上传权重与配置;或用Repository克隆后以 Git 方式push+tag_and_push打版本标签; - 训练过程持续同步:用
CommitScheduler定时增量提交日志与中间结果到数据集仓库; - 消费端拉取:用
snapshot_download拉整仓快照,或用model_file_download只取单个文件,revision传标签名即可锁定版本; - 云端上线:用
ServiceDeployer配合ServiceResourceConfig/EASDeployParameters部署到 PAI EAS,通过get轮询状态、list管理实例、delete下线服务。
小结
modelscope.hub是 ModelScope 中衔接"模型研发"与"模型服务"的枢纽层。本文以 docs/source/api/modelscope.hub.rst 的五个公开 API 为纲,逐层展开其在 modelscope/hub 目录下的实现:HubApi负责仓库与凭据管理、Repository提供 Git 式版本操作、snapshot_download与model_file_download分别覆盖整仓与单文件拉取、ServiceDeployer完成 EAS 云端部署,辅以CommitScheduler、ProgressCallback、scan_cache_dir等配套能力。理解这一模块,等于掌握了在 ModelScope 生态中发布、分发与上线模型的标准路径。
【免费下载链接】modelscopeModelScope: bring the notion of Model-as-a-Service to life.项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考