news 2026/9/16 13:54:55

ModelScope MsDataset 深度指南:统一加载、流式处理与训练数据接入的完整解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ModelScope MsDataset 深度指南:统一加载、流式处理与训练数据接入的完整解析

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

从类的文档字符串可以看出其三层设计意图:

  1. 底层存储:由 Hugging FaceDataset(或IterableDataset)支撑,提供高效的数据访问与本地缓存管理,天然继承__len____getitem__、迭代、分片、列特征等能力;
  2. 多 Hub 集成:在 HF Dataset 之上抽象出与多个远端 Hub 的数据集成能力,重点是 ModelScope 自己的 Dataset Hub;
  3. 存储抽象:屏蔽与其它远端存储(通用外部网页托管数据、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')等价于分别传namespacedataset_name
  • token 自动登录:传入token时,源码会实例化HubApi并调用api.login(token),之后访问私有数据集即可。
  • download_mode 归一化DownloadMode只有两个取值(见 constant.py):REUSE_DATASET_IF_EXISTS(默认,缓存存在则复用)与FORCE_REDOWNLOAD(强制重新下载)。
  • hub 枚举Hubs枚举只有modelscopehuggingface两个值(见 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):

  1. token非空则登录;
  2. download_modehub归一化为枚举值;
  3. 校验dataset_name必须为strlist,否则抛TypeError
  4. 对本地路径执行os.path.expanduser展开;
  5. 判定是否为本地路径(os.path.exists);
  6. 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_namedata_dirdata_filessplitcache_dirfeaturesdownload_moderevisiontokenstreaming等参数原样透传(见 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_onlytrust_remote_code等参数;
  • 否则(native/hf_compatible 等传统格式):走RemoteDataLoaderManagerMS_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_foldtest_streaming_load_afqmctest_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→ 构造TextClassificationTransformersPreprocessorto_torch_dataset→ 送入DataLoader(batch_size=5)

转换为 TensorFlow 数据集

to_tf_dataset(见 ms_dataset.py)返回tf.data.Dataset,可直接用于model.fit()。参数包括batch_sizeshufflepreprocessorscolumnscollate_fndrop_remainderlabel_colsprefetch等。需要注意的约束:

  • preprocessorsNone,则必须提供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_texttest_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),后者额外支持NativeIterableDatasetIterableDatasetIterableDatasetDict的转换,对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)执行以下步骤:

  1. 依赖检查:要求已安装 PyTorch;
  2. 根据mode(来自ModeKeys,如TRAIN)从配置中取出dataset.traindataset.val段;若不存在则以custom_cfg.model.type兜底构造ConfigDict
  3. 通过custom_cfg.task反查任务所属领域(Tasks.find_field_by_task,见 constant.py),用于选择预处理器;
  4. 若配置含preprocessor段,则用build_preprocessor构建预处理器;
  5. ExternalDatasetbuild_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_cfgds_instance变为MovieSceneSegmentationDatasetis_custom=True;不传时ds_instance保持ExternalDatasetis_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_pathdataset_namenamespaceversionnum_processes(多进程上传,默认os.cpu_count())、chunksizefilter_hidden_filesupload_modeUploadMode.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.ziptrain/001/img_001.pngtrain/。内部由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 四种来源,核心参数包括namespaceversionsubset_namesplitdownload_modecache_diruse_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 13:53:57

FPGA实现PWM波形生成:Verilog计数器比较器设计与Vivado仿真

简介&#xff1a;基于现场可编程门阵列的脉宽调制工程资料&#xff0c;面向本硕博及教研人群&#xff0c;以Vivado2019.2为平台&#xff0c;通过Verilog语言实现&#xff0c;并配套操作录像&#xff0c;适合从零学习脉宽调制算法的现场可编程门阵列编程与仿真验证。压缩包共101…

作者头像 李华
网站建设 2026/9/16 13:52:02

Pentagi:基于Neo4j图谱与Docker智能体的安全协同建模平台

1. 项目概述&#xff1a;Pentagi 是什么&#xff0c;它解决的不是“渗透测试自动化”&#xff0c;而是安全智能体的协同建模问题“Pentagi”这个名称一出现&#xff0c;很多人第一反应是“Penetration Testing AI”的缩写&#xff0c;顺手就往“AI驱动的自动化渗透工具”方向去…

作者头像 李华
网站建设 2026/9/16 13:52:02

RN4678与R7KA8D2KFLCAC蓝牙硬件协同设计实战

1. 从“蓝牙魔法”到工程现实&#xff1a;RN4678与R7KA8D2KFLCAC的真实角色定位很多人看到标题里“蓝牙魔法”四个字&#xff0c;第一反应是——这又是个营销话术堆砌的软文&#xff1f;其实不是。我去年在做一款工业级手持巡检终端时&#xff0c;就真实踩进了这个坑&#xff1…

作者头像 李华
网站建设 2026/9/16 13:50:25

FPGA雷达信号处理:从MATLAB算法到硬件流水线重构

简介&#xff1a;本资源是一套面向雷达信号处理工程师与FPGA开发者的实战型学习资料包&#xff0c;聚焦于雷达系统在FPGA平台上的算法实现与抗干扰仿真&#xff0c;解决从MATLAB算法设计到硬件部署的关键衔接问题。资源共179个文件&#xff0c;涵盖21个VHD/VHDL逻辑模块、15个M…

作者头像 李华