0

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

以前,我曾经gcloud使用 AI 平台轻松完成这项工作。我只需要:

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 都指向各自的桶存储位置(gs://*)。我的训练数据也曾经存储在存储桶中,并且位置在我的 pipeline.config 中指定。

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

我的数据以 tfrecords 的形式存在于 Azure blob 存储容器中。我正在查看的 Kubeflow 示例/文档(TFJobAzureEndtoEnd)分配持久卷,这看起来很棒,但我不明白我的工作/培训代码将如何访问我的 tfrecords。

(我一直想知道是否可以在 Azure 端到端管道的预处理部分azure-storage-blob做一些事情;在那里我可以编写一些 python 代码行来使用python 库下载数据。这仍然是猜想,我还没有还没试过。)

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

4

1 回答 1

0

好吧,我最终自己弄清楚了。事实证明,您可以在 apersistent volume claim之上定义 a storage class。可以将存储类指定为 Azure 文件共享,这让一切变得更加方便。

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 从本地计算机或现有共享/容器中移动数据)。

于 2020-07-12T13:31:06.493 回答