ModelScope MsDataset 深度指南:统一加载、流式处理与训练数据接入的完整解析
【免费下载链接】modelscopeModelScope: bring the notion of Model-as-a-Service to life.项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope
导读
本文基于 modelscope.msdatasets.ms_dataset 的 API 文档,系统讲解 ModelScope 中数据接入的核心类MsDataset的设计与实战用法。MsDataset以 Hugging FaceDataset为底层存储,向上统一了 ModelScope Hub、Hugging Face Hub、本地文件/目录以及外部云存储(如 OSS)等多路数据源,是 ModelScope 中训练器(Trainer)、Pipeline 与各类评测流程接收数据的标准入口。读完本文,你将掌握MsDataset.load的全部参数语义、四种加载场景、流式加载、PyTorch/TensorFlow 数据集转换,以及数据集上传、删除与自定义数据集构建的完整方法。
MsDataset 的定位与设计骨架
MsDataset定义于 modelscope/msdatasets/ms_dataset.py,并在 modelscope/msdatasets/init.py 中以from modelscope.msdatasets.ms_dataset import MsDataset对外导出,因此最常用的导入方式是:
from modelscope import MsDataset从类的文档字符串可以看出其三层设计意图:
- 底层存储:由 Hugging Face
Dataset(或IterableDataset)支撑,提供高效的数据访问与本地缓存管理,天然继承__len__、__getitem__、迭代、分片、列特征等能力; - 多 Hub 集成:在 HF Dataset 之上抽象出与多个远端 Hub 的数据集成能力,重点是 ModelScope 自己的 Dataset Hub;
- 存储抽象:屏蔽与其它远端存储(通用外部网页托管数据、OSS 等云存储)交互的细节。
类的内部状态只有两个字段:_hf_ds(真正的 HF 数据集实例)与_dataset_context_config(DatasetContextConfig,保存数据集加载的上下文配置),并通过属性ds_instance对外暴露底层实例。构造MsDataset时若传入target,要求该字段必须是数据集的列之一,否则抛出TypeError,这保证了对目标列做迭代时不会取到不存在的键。
MsDataset本身实现了容器协议:
__iter__:遍历底层数据集;若指定了target列则逐条产出该列的值,否则产出整条样本(dict);__getitem__:直接透传到底层数据集做索引;__len__:返回底层数据集长度。
MsDataset.load:多路数据源统一入口
MsDataset.load是使用频率最高的静态方法,定义于 ms_dataset.py。它的签名覆盖了从数据集名称、命名空间、版本、子集、切分到下载策略、缓存目录、流式加载、自定义数据集配置等全部维度:
MsDataset.load( dataset_name, # 数据集名称/路径,支持 str 或 list namespace='modelscope', # 命名空间,远程数据集必填 target=None, # 需要输出的列名 version='master', # 数据集版本(分支/标签/commit) hub=Hubs.modelscope, # 数据源:modelscope 或 huggingface subset_name=None, # 数据子集名(如 afqmc 是 clue 的子集) split=None, # 加载的切分,如 'train'/'test' data_dir=None, # 数据配置文件中的目录 data_files=None, # 数据文件路径(str/Sequence/Mapping) download_mode=DownloadMode.REUSE_DATASET_IF_EXISTS, cache_dir=MS_DATASETS_CACHE, # 本地缓存目录 features=None, # 数据集特征定义 use_streaming=False, # 是否流式加载 stream_batch_size=1, # 流式批次大小 custom_cfg=Config(), # 自定义数据集模型配置 token=None, # ModelScope SDK token dataset_info_only=False, # 仅返回配置与信息 trust_remote_code=False, # 是否信任远程代码 **config_kwargs, # 透传给底层加载器的额外参数 )关键参数与默认值解析
对照源码,几个参数的行为细节如下:
- dataset_name 支持 list:当传入
list且未指定target时,源码会自动将target置为'target',并构造一个单列数据集,即Dataset.from_dict({target: dataset_name})。这可以用于直接从 Python 列表构造一个小型 MsDataset,方便快速验证训练流程。 namespace/dataset_name简写:若dataset_name形如foo/bar(含一个/)、不是本地路径、且不是 huggingface hub,则会被自动拆分为namespace='foo'、dataset_name='bar'。因此MsDataset.load('damotest/xcopa')等价于分别传namespace与dataset_name。- token 自动登录:传入
token时,源码会实例化HubApi并调用api.login(token),之后访问私有数据集即可。 - download_mode 归一化:
DownloadMode只有两个取值(见 constant.py):REUSE_DATASET_IF_EXISTS(默认,缓存存在则复用)与FORCE_REDOWNLOAD(强制重新下载)。 - hub 枚举:
Hubs枚举只有modelscope与huggingface两个值(见 constant.py)。 - 缓存根目录:
cache_dir默认值为MS_DATASETS_CACHE,其定义在 config_ds.py;底层实现get_dataset_cache_root()(见 file_utils.py)在设置了MODELSCOPE_CACHE环境变量时返回MODELSCOPE_CACHE/datasets,否则返回~/.cache/modelscope/hub/datasets。 - 命名空间与版本默认值:
DEFAULT_DATASET_NAMESPACE = 'modelscope',DEFAULT_DATASET_REVISION = 'master'(见 constant.py)。 - CSV 大字段保护:若通过
config_kwargs传入engine='python'加载 CSV,源码会尝试将csv.field_size_limit提升到sys.maxsize,避免大单元格解析报错。
参数校验与输入预处理
load在真正加载前会做几件事(可复现于 ms_dataset.py):
token非空则登录;- 将
download_mode与hub归一化为枚举值; - 校验
dataset_name必须为str或list,否则抛TypeError; - 对本地路径执行
os.path.expanduser展开; - 判定是否为本地路径(
os.path.exists); - 若
trust_remote_code=True,打印安全警告,提示将执行外部代码,需确保代码可信。
随后这些参数会被打包进DatasetContextConfig,作为后续所有加载器共享的上下文。
四种加载场景的底层分发逻辑
MsDataset.load内部按优先级把加载请求分发给三条路径(对应源码 ms_dataset.py):
1. 从本地磁盘加载
当dataset_name命中以下任一情况时走本地加载:
- 属于 HF 内置打包模块(
datasets.packaged_modules._PACKAGED_DATASETS_MODULES); - 是一个本地目录;
- 是一个本地文件。
本地加载通过LocalDataLoaderManager(见 data_loader_manager.py)实现。其中有个实用细节:当dataset_name是单文件时,会根据文件扩展名推断加载器(EXTENSIONS_TO_LOAD中登记的扩展名,如 csv/json 等),自动把data_files指向该文件并把dataset_name替换为对应的内置模块名。因此你可以直接:
# 加载本地 CSV 文件(等价写法,目录亦可) ds = MsDataset.load('my_data/train.csv') ds = MsDataset.load('my_data/')tests/msdatasets/test_ms_dataset.py中的test_load_local_csv用例同时验证了单文件路径与目录路径两种形式都能正确加载。
2. 从 Hugging Face Hub 加载
当hub=Hubs.huggingface时,load直接调用datasets.load_dataset,将subset_name、data_dir、data_files、split、cache_dir、features、download_mode、revision、token、streaming等参数原样透传(见 ms_dataset.py)。这意味着 Hugging Face 上绝大多数数据集都可以通过同一套MsDataset.load参数接入,例如:
from modelscope import MsDataset from modelscope.utils.constant import Hubs ds = MsDataset.load( 'glue', subset_name='sst2', split='train', hub=Hubs.huggingface, use_streaming=True)3. 从 ModelScope Hub 加载(通用数据集类型)
ModelScope Hub 上的数据集分为多种 formation(见 constant.py):
hf_compatible = 1:与 Hugging Face 官方数据集兼容,整个数据集组织为一个 zip 文件;native = 2:ModelScope 原生格式,支持一个数据集包含多个文件;general = 4:通用格式。
当hub=Hubs.modelscope时,源码会先通过HubApi获取读取 endpoint 与数据集类型(get_dataset_id_and_type),然后:
- 若
dataset_type == DatasetFormations.general(即值为 4):走load_dataset_with_ctx上下文管理器加载,支持dataset_info_only、trust_remote_code等参数; - 否则(native/hf_compatible 等传统格式):走
RemoteDataLoaderManager的MS_DATA_LOADER分支(见 data_loader_manager.py),内部实例化OssDownloader完成下载,并统计下载 PV/UV。
4. 从列表快速构造
如前所述,dataset_name传入list时不会触发任何远端请求,直接在本地构造单列数据集,适用于快速测试:
ds = MsDataset.load(['a', 'b', 'c']) # target 自动设为 'target'流式加载大模型数据:use_streaming
对于规模很大的数据集(如蛋白质结构数据、海量语料),MsDataset.load支持流式加载,无需先下载全部数据文件。开启use_streaming=True后:
- 从 ModelScope Hub / 本地加载时返回
NativeIterableDataset(定义于 dataset_cls/dataset.py),它是基于 HFIterableDataset的迭代式数据集; stream_batch_size控制流式批次大小;- 返回对象同样支持
next(iter(ds))逐条消费。
测试 test_ms_dataset.py 中的test_streaming_load_uni_fold、test_streaming_load_afqmc、test_streaming_load_from_hf分别验证了从 ModelScope Hub 与 Hugging Face Hub 流式加载的可行性。一个典型的流式加载示例:
dataset = MsDataset.load( dataset_name='Uni-Fold-Data', split='train', use_streaming=True, namespace='DPTech') data_example = next(iter(dataset))注意:
use_streaming=True时不会一次性下载所有数据文件,而是随迭代进度渐进拉取,适合内存受限或数据量巨大的场景;默认stream_batch_size=1。
数据集与训练框架对接:to_torch_dataset / to_tf_dataset
MsDataset的核心价值之一是让数据集无缝进入 PyTorch / TensorFlow 训练管线。
转换为 PyTorch 数据集
to_torch_dataset(见 ms_dataset.py)将 MsDataset 转为torch.utils.data.Dataset,可直接交给torch.utils.data.DataLoader。其参数:
preprocessors:预处理器(单个 Callable 或列表),逐样本加工,输出 dict 的每个数值字段会成为样本字段;columns:需要保留的列(to_tensor=True时仅保留数值列);to_tensor=True:是否把列转为torch.Tensor;data_config/task_name:自定义数据集(ExternalDataset)场景下使用的配置。
实现要点(见 ms_dataset.py):当传入preprocessors时,内部会先取一条样本“试跑”一遍预处理器,判断各输出字段是否为数值(np.integer/np.floating);非数值字段会被过滤并给出 warning,数值字段封装进内部类MsMapDataset,在__getitem__中按需做torch.as_tensor转换。若未传预处理器,则直接调用底层 HF 数据集的set_format(type='torch', columns=...)。
测试用例test_to_torch_dataset_text(见 test_ms_dataset.py)展示了完整链路:加载damotest/xcopa→ 构造TextClassificationTransformersPreprocessor→to_torch_dataset→ 送入DataLoader(batch_size=5)。
转换为 TensorFlow 数据集
to_tf_dataset(见 ms_dataset.py)返回tf.data.Dataset,可直接用于model.fit()。参数包括batch_size、shuffle、preprocessors、columns、collate_fn、drop_remainder、label_cols、prefetch等。需要注意的约束:
- 若
preprocessors为None,则必须提供collate_fn,否则记录错误日志并返回None; - 传入
preprocessors时走_to_tf_dataset_with_processors(见 ms_dataset.py),内部用tf.numpy_function逐样本执行预处理,支持label_cols自动拆分特征与标签、prefetch(AUTOTUNE)预取; - 未传预处理器时直接调用 HF 数据集的
to_tf_dataset。
测试test_to_tf_dataset_text、test_to_tf_dataset_img(见 test_ms_dataset.py)分别验证了文本与图像两类数据集的 TF 转换。
其它转换与列操作
to_hf_dataset():重置格式后返回底层 HFDataset,方便使用 HF 生态的.select()、.map()等 API;remap_columns(column_mapping):重命名列并直接返回底层 HF 数据集;from_hf_dataset(hf_ds, target):已被标记为 deprecated,请改用to_ms_dataset()(见 ms_dataset.py),后者额外支持NativeIterableDataset、IterableDataset、IterableDatasetDict的转换,对DatasetDict/IterableDatasetDict会返回{k: MsDataset}字典;测试test_to_ms_dataset(见 test_ms_dataset.py)验证了从 HFload_dataset结果直接转换的路径。
自定义数据集:to_custom_dataset 与 custom_cfg
MsDataset.load支持传入custom_cfg(模型配置,Config对象)将通用数据集转成任务特定的自定义数据集,这在 ModelScope 的训练脚本中非常常见。其背后的to_custom_dataset方法(见 ms_dataset.py)执行以下步骤:
- 依赖检查:要求已安装 PyTorch;
- 根据
mode(来自ModeKeys,如TRAIN)从配置中取出dataset.train或dataset.val段;若不存在则以custom_cfg.model.type兜底构造ConfigDict; - 通过
custom_cfg.task反查任务所属领域(Tasks.find_field_by_task,见 constant.py),用于选择预处理器; - 若配置含
preprocessor段,则用build_preprocessor构建预处理器; - 对
ExternalDataset用build_custom_dataset构建自定义数据集;否则将数据转换(带预处理器时走_to_torch_dataset_with_processors,否则直接set_format(type='torch')),并把is_custom置为True。
测试test_to_custom_dataset_movie_scene_toydata(见 test_ms_dataset.py)给出了关键结论:传入custom_cfg后ds_instance变为MovieSceneSegmentationDataset且is_custom=True;不传时ds_instance保持ExternalDataset且is_custom=False。
实战:从加载到训练的最小闭环
综合上述能力,一个典型的 ModelScope 训练脚本数据准备段如下(参考 examples/pytorch/image_classification/finetune_image_classification.py):
from modelscope import MsDataset def create_dataset(name, split): namespace, dataset_name = name.split('/') return MsDataset.load( dataset_name, namespace=namespace, subset_name='default', split=split) train_dataset = create_dataset('damo/some_image_dataset', split='train') val_dataset = create_dataset('damo/some_image_dataset', split='validation') # 之后可直接作为 build_trainer 的 train_dataset / eval_dataset 传入其它示例可参考 finetune_human_detection.py、finetune_multi_modal_embedding.py、finetune_named_entity_recognition.py 等,均遵循MsDataset.load(...)→ 训练器的模式。
如果只想快速验证数据加载,可以配合to_hf_dataset().select(range(n))取前 n 条观察(测试test_ms_csv_basic中即用MsDataset.load('clue', subset_name='afqmc', split='train').to_hf_dataset().select(range(5))打印样本)。
数据集运维:上传、删除与版本管理
MsDataset还提供了数据集运维相关的静态方法,但需要留意 deprecation 状态(见 ms_dataset.py):
MsDataset.upload(...)(已弃用):向 ModelScope Hub 上传文件或目录。参数包括object_name(远端对象名,可为xxx.zip或目录名)、local_file_path、dataset_name、namespace、version、num_processes(多进程上传,默认os.cpu_count())、chunksize、filter_hidden_files、upload_mode(UploadMode.OVERWRITE覆盖 /UploadMode.APPEND追加,见 constant.py)。源码在调用时会给出 DeprecationWarning,建议改用 git 命令行或HubApi.upload_folder/HubApi.upload_file。MsDataset.clone_meta(...)(已弃用):克隆数据集元文件(meta-file),内部通过DatasetRepository实现,同样建议改用 git 命令行 clone。MsDataset.upload_meta(...)(已弃用):推送元文件,提交信息、分支、force强推等由DatasetRepository.push完成,建议改用 git 或 CLI。MsDataset.delete(...):删除数据集中的对象。object_name可以是文件名或目录名(目录以/结尾),例如your-data-name.zip、train/001/img_001.png、train/。内部由DatasetDeleteManager(见 modelscope/msdatasets/utils/delete_utils.py)执行,使用前需先登录且具备数据集管理权限。
与 ModelScope 生态的协同
MsDataset在整个 ModelScope 生态中处于数据入口的位置:训练器(build_trainer接收train_dataset/eval_dataset)、Pipeline 评测、导出工具等都以它为数据交换载体。其 API 文档由 Sphinxautomodule自动生成(见 docs/source/api/modelscope.msdatasets.ms_dataset.rst),并在 docs/source/index.rst 中通过MsDataset <api/modelscope.msdatasets>链接对外可见。理解MsDataset的加载分发与转换机制,是深入 ModelScope 训练与评测流程的前提;而 tests/msdatasets/test_ms_dataset.py 中覆盖本地 CSV、ModelScope Hub、Hugging Face Hub、流式加载、Torch/TF 转换、自定义数据集等场景的测试用例,则是你验证行为、排查问题的最佳参考。
小结
MsDataset.load是统一的数据加载入口,支持本地磁盘、Hugging Face Hub、ModelScope Hub 与 list 四种来源,核心参数包括namespace、version、subset_name、split、download_mode、cache_dir、use_streaming等,全部有明确默认值与底层语义;- 大规模数据可使用
use_streaming=True流式消费,返回NativeIterableDataset; to_torch_dataset/to_tf_dataset让数据集零成本接入 PyTorch 与 TensorFlow 训练管线,to_hf_dataset/remap_columns提供与 HF 生态互通的通道;custom_cfg+to_custom_dataset支持将通用数据集转为任务定制数据集;- 上传、删除、元文件管理方法可用,但上传与元文件相关接口已标记 deprecated,官方推荐使用 git 命令行或
HubApi的相关方法。
【免费下载链接】modelscopeModelScope: bring the notion of Model-as-a-Service to life.项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考