如何在 Azure 上的对象检测 API 的分布式训练作业(TF 作业)中设置数据访问

How to set up data access in a distributed training job (TF Job) for Object Detection API on Azure

一段时间以来,我一直在尝试为 Azure 上的 TensorFlow Object Detection API 设置 分布式 训练。我对如何将我的数据准确地设置到作业中有点困惑。

以前,我曾经使用 AI-Platform 在 gcloud 上轻松完成这项工作。我只需要:

gcloud ai-platform jobs submit training $JOB_NAME \
    --runtime-version $VERSION \
    --job-dir=$JOB_DIR \
    --packages $OBJ_DET,$SLIM,$PYCOCOTOOLS \
    --module-name object_detection.model_main \
    --region us-central1 \
    --config $CONF/config.yaml \
    -- \
    --model_dir=$MODEL_DIR \
    --pipeline_config_path=$PIPELINE_PATH

其中config.yaml包含集群配置,JOB_DIR、MODEL_DIR、PIPELINE_PATH均指向各自的bucket存储位置(gs://*)。我的训练数据过去也存储在存储桶中,位置在我的 pipeline.config.

中指定

现在在 Azure 上,我似乎没有直接的方法可以 运行 分布式训练作业。我已经使用 AKS 部署了一个 GPU 加速的 Kubernetes 集群,然后安装了 NVIDIA 驱动程序。我还部署了 Kubeflow,并对对象检测进行了 docker 化 API.

我的数据以 tfrecords 的形式存在于 Azure blob 存储容器中。我正在查看的 Kubeflow examples/documentation (TFJob, AzureEndtoEnd) 分配持久卷,这看起来不错,但我不明白我的 job/training-code 将如何访问我的 tfrecords。

(我一直想知道是否可以在 Azure 端到端管道的 preprocessing part 中做一些事情;在那里我可以编写一些 python 代码行来使用azure-storage-blob python 库。这仍然是推测,我还没有尝试过。)

因此,如果您对这个难题有任何帮助,我们将不胜感激。如果有人指出任何有用的最新资源,我也将不胜感激。这是我看过的其他两个资源:

好吧,我自己解决了这个问题。事实证明,您可以在 storage class 之上定义 persistent volume claim。存储class可以指定为Azure File Share,这样就方便多了。

sc.yaml:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: <NAME>
provisioner: kubernetes.io/azure-file
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
parameters:
  storageAccount: <STORAGE_ACC_NAME>

pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <NAME>
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: <NAME>
  resources:
    requests:
      storage: 20Gi

然后可以通过以下方式创建和声明持久卷:

kubectl apply -f sc.yaml
kubectl apply -f pvc.yaml

在此之后,一个共享出现在指定的存储帐户中,您可以简单地利用 Azure 文件共享的系统将数据无缝上传到其中(比如可能使用 azcopy 从您的本地计算机或现有的 share/container).