Как вы интегрируете поддержку графического процессора с Dask Gateway?

В настоящее время мы используем Dask Gateway только с рабочими процессорами. Однако в будущем, когда глубокое обучение получит более широкое распространение, мы хотим перейти к добавлению поддержки графического процессора для кластеров, созданных с помощью Dask Gateway.

Я проверил документацию Dask Gateway, и там не так много подробных инструкций о том, как это настроить и какие части диаграммы / конфигурации руля нам нужно изменить, чтобы включить эту функцию.

Я думаю, что сначала нужно добавить графический процессор в кластер GKE на GCP, а затем использовать файл докеров RAPIDS для рабочих задач, использующих этот графический процессор? Это все, что нужно для настройки Dask Gateway?

Был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении.


person Riley Hun    schedule 08.12.2020    source источник
comment
Я добавил ответ на основную часть вашего вопроса. Я рекомендую вам открыть отдельный вопрос о необходимости графических процессоров для SciKeras, Skorch и т. Д.   -  person Jacob Tomlinson    schedule 09.12.2020
comment
Большое спасибо @JacobTomlinson. Я обязательно это сделаю. Мой последний вопрос будет к нашей организации: вы рекомендуете, чтобы у нас было 2 экземпляра шлюза: один с вычислениями ЦП, а другой с вычислениями на GPU? Или может ли экземпляр шлюза с вычислениями на GPU потенциально заменить экземпляр с вычислениями на CPU?   -  person Riley Hun    schedule 10.12.2020
comment
Честно говоря, я не уверен. Было бы хорошо, если бы у Gateway была концепция профилей, чтобы вы могли выбирать разные конфигурации кластера (возможно, вы могли бы поднять вопрос GitHub, чтобы предложить это). Я думаю, что сегодня самый простой способ действий - иметь несколько шлюзов.   -  person Jacob Tomlinson    schedule 10.12.2020


Ответы (1)


Чтобы запустить кластер Dask на Kubernetes, способный выполнять вычисления на GPU, вам потребуется следующее:

  • Узлам Kubernetes требуются графические процессоры и драйверы. Это можно настроить с помощью подключаемого модуля NVIDIA k8s.
  • Для модулей планировщика и рабочих модулей потребуется образ Docker с установленными инструментами NVIDIA. Как вы предлагаете, для этого подходят изображения RAPIDS.
  • Спецификации контейнера пода потребуются ресурсы графического процессора, такие как resources.limits.nvidia.com/gpu: 1
  • Рабочие процессы Dask должны быть запущены с помощью команды dask-cuda-worker из пакета dask_cuda (который включен в образы RAPIDS).

Примечание. Для Dask Gateway ваш образ контейнера также требует установки пакета dask-gateway. Мы можем настроить его для установки во время выполнения, но, вероятно, лучше всего создать собственный образ с установленным этим пакетом.

Поэтому вот минимальная конфигурация Dask Gateway, которая даст вам кластер GPU.

# config.yaml
gateway:
  backend:
    image:
      name: rapidsai/rapidsai
      tag: cuda11.0-runtime-ubuntu18.04-py3.8  # Be sure to match your k8s CUDA version and user's Python version

    worker:
      extraContainerConfig:
        env:
          - name: EXTRA_PIP_PACKAGES
            value: "dask-gateway"
        resources:
          limits:
            nvidia.com/gpu: 1  # This could be >1, you will get one worker process in the pod per GPU

    scheduler:
      extraContainerConfig:
        env:
          - name: EXTRA_PIP_PACKAGES
            value: "dask-gateway"
        resources:
          limits:
            nvidia.com/gpu: 1  # The scheduler requires a GPU in case of accidental deserialisation

  extraConfig:
    cudaworker: |
      c.ClusterConfig.worker_cmd = "dask-cuda-worker"

Мы можем протестировать работу, запустив шлюз Dask, создав кластер Dask и выполнив некоторую работу, специфичную для графического процессора. Вот пример, где мы получаем версию драйвера NVIDIA от каждого воркера.

$ helm install dgwtest daskgateway/dask-gateway -f config.yaml
In [1]: from dask_gateway import Gateway

In [2]: gateway = Gateway("http://dask-gateway-service")

In [3]: cluster = gateway.new_cluster()

In [4]: cluster.scale(1)

In [5]: from dask.distributed import Client

In [6]: client = Client(cluster)

In [7]: def get_nvidia_driver_version():
   ...:     import pynvml
   ...:     return pynvml.nvmlSystemGetDriverVersion()
   ...: 

In [9]: client.run(get_nvidia_driver_version)
Out[9]: {'tls://10.42.0.225:44899': b'450.80.02'}
person Jacob Tomlinson    schedule 09.12.2020
comment
Большое спасибо @JacobTomlinson. Это очень полезная информация. - person Riley Hun; 10.12.2020