如何配置YOLOv8 yaml文件来访问Azure上的blob存储数据集?

Ale*_*x P 5 machine-learning azure yolo azure-machine-learning-service azuremlsdk

语境

\n

我想使用 Yolo (v8) 训练自定义模型。我已经让它在我的本地计算机上运行,​​但速度非常慢,并且希望在 Azure 机器学习工作室上运行该作业以提高效率。我在用Azure ML SDK v2

\n

问题

\n

当我在 Azure ML 上运行时,收到一条错误消息,指出 YOLO 无法找到我的训练图像。

\n
Traceback (most recent call last):\nFile "/opt/conda/envs/ptca/lib/python3.8/site-packages/ultralytics/yolo/engine/trainer.py", line 125, in __init__\n  self.data = check_det_dataset(self.args.data)\nFile "/opt/conda/envs/ptca/lib/python3.8/site-packages/ultralytics/yolo/data/utils.py", line 243, in check_det_dataset\n  raise FileNotFoundError(msg)\nFileNotFoundError: \nDataset \'custom.yaml\' not found \xe2\x9a\xa0\xef\xb8\x8f, missing paths [\'/mnt/azureml/cr/j/18bdc3371eca4975a0c4a7123f9adaec/exe/wd/valid/images\']\n
Run Code Online (Sandbox Code Playgroud)\n

代码/分析

\n

这是我用来运行该作业的代码:

\n
command_job = command(\n    display_name=\'Test Run 1\',\n    code="./src/",\n    command="yolo detect train data=custom.yaml model=yolov8n.pt epochs=1 imgsz=1280 seed=42",\n    environment="my-custom-env:3",\n    compute=compute_target\n)\n
Run Code Online (Sandbox Code Playgroud)\n

在我的本地计算机上(使用 Visual Studio 代码),该custom.yaml文件位于./src/目录中。当我运行上面的作业时,custom.yaml会上传并显示在Code作业的部分中(在 Azure ML Studio 中查看)。通过调查,我认为这是具有路径的计算工作目录:

\n
\'/mnt/azureml/cr/j/18bdc3371eca4975a0c4a7123f9adaec/exe/wd/\'\n
Run Code Online (Sandbox Code Playgroud)\n

我的 custom.yaml 如下所示:

\n
path: ../\ntrain: train/images\nval: valid/images\n\nnc: 1\nnames: ["bike"]\n
Run Code Online (Sandbox Code Playgroud)\n

所以发生的事情是 YOLO 正在查看 my ,使用根目录作为路径,并尝试在该目录中custom.yaml查找:valid/images

\n
\'/mnt/azureml/cr/j/18bdc3371eca4975a0c4a7123f9adaec/exe/wd/valid/images\'\n
Run Code Online (Sandbox Code Playgroud)\n

我的图像位于 my Datastore,而不是该目录中,因此出现错误。

\n

我尝试过的-更新custom.yaml路径

\n

我的所有数据(trainvalid)都包含在AzureBlobStorage. 在 Azure ML Studio 中,我创建了 aDatastore并将我的数据添加为 a Dataset(引用我的 AzureBlobStorage 帐户)。我的文件结构是:

\n
Dataset/\n   - Train/\n        - Images\n        - Labels\n   - Valid/\n        - Images\n        - Labels\n
Run Code Online (Sandbox Code Playgroud)\n

在我的custom.yaml文件中,我尝试path用以下内容替换:

\n
 **Storage URI**: https://mystorageaccount.blob.core.windows.net/my-datasets\n **Datastore URI**: azureml://subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourcegroups/my-rg/workspaces/my_workspage/datastores/my_datastore/paths/Dataset/\n
Run Code Online (Sandbox Code Playgroud)\n

如果我这样做,我会得到同样的错误。这次它将附加path到工作目录的末尾。例子:

\n
    \'/mnt/azureml/cr/j/18bdc3371eca4975a0c4a7123f9adaec/exe/wd/https://mystorageaccount.blob.core.windows.net/my-datasets/valid/images\'\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过的 - mounting/download数据集

\n

我已经阅读了 Microsoft 文档 - (例如这里这里) - 它说的是这样的:

\n
\n

对于大多数情况,您将使用 URI(uri_folder 和 uri_file) - 存储中的一个位置,可以通过将存储安装或下载到节点来轻松映射到作业中计算节点的文件系统。

\n
\n

感觉我应该将我的数据(在我的Datastore)映射到计算文件系统。然后我就可以在我的custom.yaml. 文件并不清楚我是如何做到这一点的。

\n

简而言之:如何在 Azure ML 上设置数据,以便path我的custom.yaml点指向数据?

\n

oup*_*phi 2

解决方案是创建一个带有路径的文件夹数据资产azureml://datastores/<data_store_name>/paths/<dataset-path>,并将其作为输入传递到 AzureML 作业。AzureML 作业在运行时解析 uri_folder 输入的路径,因此custom.yaml可以通过编程方式更新以包含此路径。

以下是实施此解决方案的 AzureML 作业的示例:

from azure.ai.ml import command
from azure.ai.ml import Input

command_job = command(
    inputs=dict(
        data=Input(
            type="uri_folder",
            path="azureml:your-data-asset:version-number",
        )
    ),
    command="""
    echo "The data asset path is ${{ inputs.data }}" &&
    # Update custom.yaml to contain the correct path
    sed -i "s|path:.*$|path: ${{ inputs.data }}|" custom.yaml &&
    # Now custom.yaml contains the correct path so we can run the training
    yolo detect train data=custom.yaml model=yolov8n.pt epochs=1 imgsz=1280 seed=42 project=your-experiment name=experiment
    """,
    code="./src/",
    environment="your-environment",
    compute="your-compute-target",
    experiment_name="your-experiment",
    display_name="your-display-name",
)
Run Code Online (Sandbox Code Playgroud)

请注意,您需要安装最新的 mlflow 和 azureml-mlflow 库,以确保使用 mlflow 记录您的模型、参数和指标:

ultralytics==8.0.133
azureml-mlflow==1.52.0
mlflow==2.4.2
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,我发布了教程,解释了使用 AzureML 运行 yolov8 训练的所有步骤:

在博文中,我从本地文件夹创建 azureML 数据集。在您的情况下,数据集已存储在数据存储中,因此您在创建 azureml 数据资产azureml://datastores/<data_store_name>/paths/<dataset-path>时需要指定路径而不是本地路径。

  • @AlexP 这个解决方案对你有用吗?如果确实如此,请接受答案,因为它对您(提供答案的人)以及未来的读者都有帮助。 (2认同)