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从类的文档字符串可以看出其三层设计意图底层存储由 Hugging FaceDataset或IterableDataset支撑提供高效的数据访问与本地缓存管理天然继承__len__、__getitem__、迭代、分片、列特征等能力多 Hub 集成在 HF Dataset 之上抽象出与多个远端 Hub 的数据集成能力重点是 ModelScope 自己的 Dataset Hub存储抽象屏蔽与其它远端存储通用外部网页托管数据、OSS 等云存储交互的细节。类的内部状态只有两个字段_hf_ds真正的 HF 数据集实例与_dataset_context_configDatasetContextConfig保存数据集加载的上下文配置并通过属性ds_instance对外暴露底层实例。构造MsDataset时若传入target要求该字段必须是数据集的列之一否则抛出TypeError这保证了对目标列做迭代时不会取到不存在的键。MsDataset本身实现了容器协议__iter__遍历底层数据集若指定了target列则逐条产出该列的值否则产出整条样本dict__getitem__直接透传到底层数据集做索引__len__返回底层数据集长度。MsDataset.load多路数据源统一入口MsDataset.load是使用频率最高的静态方法定义于 ms_dataset.py。它的签名覆盖了从数据集名称、命名空间、版本、子集、切分到下载策略、缓存目录、流式加载、自定义数据集配置等全部维度MsDataset.load( dataset_name, # 数据集名称/路径支持 str 或 list namespacemodelscope, # 命名空间远程数据集必填 targetNone, # 需要输出的列名 versionmaster, # 数据集版本分支/标签/commit hubHubs.modelscope, # 数据源modelscope 或 huggingface subset_nameNone, # 数据子集名如 afqmc 是 clue 的子集 splitNone, # 加载的切分如 train/test data_dirNone, # 数据配置文件中的目录 data_filesNone, # 数据文件路径str/Sequence/Mapping download_modeDownloadMode.REUSE_DATASET_IF_EXISTS, cache_dirMS_DATASETS_CACHE, # 本地缓存目录 featuresNone, # 数据集特征定义 use_streamingFalse, # 是否流式加载 stream_batch_size1, # 流式批次大小 custom_cfgConfig(), # 自定义数据集模型配置 tokenNone, # ModelScope SDK token dataset_info_onlyFalse, # 仅返回配置与信息 trust_remote_codeFalse, # 是否信任远程代码 **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则会被自动拆分为namespacefoo、dataset_namebar。因此MsDataset.load(damotest/xcopa)等价于分别传namespace与dataset_name。token 自动登录传入token时源码会实例化HubApi并调用api.login(token)之后访问私有数据集即可。download_mode 归一化DownloadMode只有两个取值见 constant.pyREUSE_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 modelscopeDEFAULT_DATASET_REVISION master见 constant.py。CSV 大字段保护若通过config_kwargs传入enginepython加载 CSV源码会尝试将csv.field_size_limit提升到sys.maxsize避免大单元格解析报错。参数校验与输入预处理load在真正加载前会做几件事可复现于 ms_dataset.pytoken非空则登录将download_mode与hub归一化为枚举值校验dataset_name必须为str或list否则抛TypeError对本地路径执行os.path.expanduser展开判定是否为本地路径os.path.exists若trust_remote_codeTrue打印安全警告提示将执行外部代码需确保代码可信。随后这些参数会被打包进DatasetContextConfig作为后续所有加载器共享的上下文。四种加载场景的底层分发逻辑MsDataset.load内部按优先级把加载请求分发给三条路径对应源码 ms_dataset.py1. 从本地磁盘加载当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 加载当hubHubs.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_namesst2, splittrain, hubHubs.huggingface, use_streamingTrue)3. 从 ModelScope Hub 加载通用数据集类型ModelScope Hub 上的数据集分为多种 formation见 constant.pyhf_compatible 1与 Hugging Face 官方数据集兼容整个数据集组织为一个 zip 文件native 2ModelScope 原生格式支持一个数据集包含多个文件general 4通用格式。当hubHubs.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_streamingTrue后从 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_nameUni-Fold-Data, splittrain, use_streamingTrue, namespaceDPTech) data_example next(iter(dataset))注意use_streamingTrue时不会一次性下载所有数据文件而是随迭代进度渐进拉取适合内存受限或数据量巨大的场景默认stream_batch_size1。数据集与训练框架对接to_torch_dataset / to_tf_datasetMsDataset的核心价值之一是让数据集无缝进入 PyTorch / TensorFlow 训练管线。转换为 PyTorch 数据集to_torch_dataset见 ms_dataset.py将 MsDataset 转为torch.utils.data.Dataset可直接交给torch.utils.data.DataLoader。其参数preprocessors预处理器单个 Callable 或列表逐样本加工输出 dict 的每个数值字段会成为样本字段columns需要保留的列to_tensorTrue时仅保留数值列to_tensorTrue是否把列转为torch.Tensordata_config/task_name自定义数据集ExternalDataset场景下使用的配置。实现要点见 ms_dataset.py当传入preprocessors时内部会先取一条样本“试跑”一遍预处理器判断各输出字段是否为数值np.integer/np.floating非数值字段会被过滤并给出 warning数值字段封装进内部类MsMapDataset在__getitem__中按需做torch.as_tensor转换。若未传预处理器则直接调用底层 HF 数据集的set_format(typetorch, columns...)。测试用例test_to_torch_dataset_text见 test_ms_dataset.py展示了完整链路加载damotest/xcopa→ 构造TextClassificationTransformersPreprocessor→to_torch_dataset→ 送入DataLoader(batch_size5)。转换为 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()等 APIremap_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_cfgMsDataset.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(typetorch)并把is_custom置为True。测试test_to_custom_dataset_movie_scene_toydata见 test_ms_dataset.py给出了关键结论传入custom_cfg后ds_instance变为MovieSceneSegmentationDataset且is_customTrue不传时ds_instance保持ExternalDataset且is_customFalse。实战从加载到训练的最小闭环综合上述能力一个典型的 ModelScope 训练脚本数据准备段如下参考 examples/pytorch/image_classification/finetune_image_classification.pyfrom modelscope import MsDataset def create_dataset(name, split): namespace, dataset_name name.split(/) return MsDataset.load( dataset_name, namespacenamespace, subset_namedefault, splitsplit) train_dataset create_dataset(damo/some_image_dataset, splittrain) val_dataset create_dataset(damo/some_image_dataset, splitvalidation) # 之后可直接作为 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_nameafqmc, splittrain).to_hf_dataset().select(range(5))打印样本。数据集运维上传、删除与版本管理MsDataset还提供了数据集运维相关的静态方法但需要留意 deprecation 状态见 ms_dataset.pyMsDataset.upload(...)已弃用向 ModelScope Hub 上传文件或目录。参数包括object_name远端对象名可为xxx.zip或目录名、local_file_path、dataset_name、namespace、version、num_processes多进程上传默认os.cpu_count()、chunksize、filter_hidden_files、upload_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.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_streamingTrue流式消费返回NativeIterableDatasetto_torch_dataset/to_tf_dataset让数据集零成本接入 PyTorch 与 TensorFlow 训练管线to_hf_dataset/remap_columns提供与 HF 生态互通的通道custom_cfgto_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),仅供参考