Можно ли запустить несколько контейнеров для обслуживания тензорных потоков на одном узле графического процессора Kubernetes

Я использую модель Tensorflow в кластере AKS с узлами графического процессора. В настоящее время модель работает в одном контейнере обслуживания TF (https://hub.docker.com/r/tensorflow/serving) в одном модуле на одном узле графического процессора.

По умолчанию обслуживающий контейнер TF будет требовать всю доступную оперативную память в модуле, но я могу уменьшить масштаб запроса памяти контейнером в моем deployment.yaml файле и по-прежнему получать те же результаты с приемлемым временем обработки. Мне было интересно, есть ли возможность запускать две модели TF параллельно на одном узле GPU. С точки зрения памяти это должно работать, но когда я пытаюсь адаптировать набор реплик своего развертывания к двум, он пытается развернуть два модуля, но второй зависает в состоянии ожидания.

$ kubectl get po -n myproject -w
NAME                                 READY   STATUS    RESTARTS   AGE
myproject-deployment-cb7769df4-ljcfc   1/1     Running   0          2m
myproject-deployment-cb7769df4-np9qd   0/1     Pending   0          26s

Если я описываю модуль, я получаю следующую ошибку

$ kubectl describe po -n myproject myproject-deployment-cb7769df4-np9qd
Name:           myproject-deployment-cb7769df4-np9qd
Namespace:      myproject
<...>
Events:
  Type     Reason            Age   From                Message
  ----     ------            ----  ----                -------
  Warning  FailedScheduling  105s  default-scheduler   0/1 nodes are available: 1 Insufficient nvidia.com/gpu.

Поскольку первый модуль «требует» графического процессора, второй модуль больше не может его использовать и остается в состоянии ожидания. Я вижу две разные возможности:

  1. Запуск двух обслуживающих контейнеров TF в одном модуле на одном узле GPU
  2. Запуск двух модулей, каждый с одним обслуживающим контейнером TF на одном узле графического процессора.

Возможен ли какой-либо из вышеперечисленных вариантов?

Мое развертывание можно найти ниже.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myproject-deployment
  labels:
    app: myproject-server
  namespace: myproject
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myproject-server
  template:
    metadata:
      labels:
        app: myproject-server
    spec:
      containers:
      - name: server
        image: tensorflow/serving:2.3.0-gpu
        ports:
        - containerPort: 8500
        volumeMounts:
          - name: azurestorage
            mountPath: /models
        resources:
          requests:
            memory: "10Gi"
            cpu: "1"
          limits:
            memory: "12Gi"
            cpu: "2"
            nvidia.com/gpu: 1
        args: ["--model_config_file=/models/models.config", "--monitoring_config_file=/models/monitoring.config"]
      volumes:
      - name: azurestorage
        persistentVolumeClaim:
          claimName: pvcmodels


person JohnBoscamp    schedule 22.04.2021    source источник


Ответы (1)


Интересный вопрос - насколько мне известно, это невозможно, в том числе и для двух контейнеров, работающих как один модуль (ресурсы настраиваются на уровне контейнера), по крайней мере, не сразу (см. https://github.com/kubernetes/kubernetes/issues/52757)

Я нашел это при поиске ответа: https://blog.ml6.eu/a-guide-to-gpu-sharing-on-top-of-kubernetes-6097935ababf, но для этого нужно повозиться с самими кубернетами.

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

person antaxify    schedule 22.04.2021