Обмен технологиями

Исследование управления ресурсами графического процессора K8s: развертывание большой модели ИИ Ollama на KubeSphere

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Автор: Эксплуатация и обслуживание Youshu Star Master С быстрым развитием искусственного интеллекта, машинного обучения и технологий больших моделей искусственного интеллекта наша потребность в вычислительных ресурсах также растет. Использование ресурсов графического процессора становится критически важным, особенно для крупных моделей искусственного интеллекта, которым необходимо обрабатывать крупномасштабные данные и сложные алгоритмы. Для инженеров по эксплуатации и техническому обслуживанию стало незаменимым навыком управлять ресурсами графического процессора и настраивать их в кластерах Kubernetes, а также эффективно развертывать приложения, использующие эти ресурсы.

Сегодня я познакомлю вас с более глубоким пониманием того, как использовать мощную экосистему и инструменты Kubernetes для управления ресурсами графического процессора и развертывания приложений на платформе KubeSphere. Вот три основные темы, которые будут рассмотрены в этой статье:

  1. Расширение кластера и интеграция узлов графического процессора: Мы будем использовать инструмент KubeKey для расширения кластера Kubernetes и добавления рабочих узлов с возможностями графического процессора, чтобы обеспечить необходимую аппаратную поддержку приложений искусственного интеллекта.
  2. Интеграция Kubernetes для ресурсов графического процессора: используйте Helm для установки и настройки оператора NVIDIA GPU — решения, официально предоставляемого NVIDIA и предназначенного для упрощения вызова и управления ресурсами графического процессора в кластерах Kubernetes.
  3. Практическое применение: инструмент управления большими моделями Ollama: Мы развернем Ollama, инструмент управления, специально разработанный для больших моделей искусственного интеллекта, в KubeSphere, чтобы проверить, можно ли правильно планировать и эффективно использовать ресурсы графического процессора.

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

Лучшие практики KubeSphere «2024» Конфигурация аппаратного обеспечения экспериментальной среды и информация о программном обеспечении из серии документов следующие:

Фактическая конфигурация сервера (копия архитектуры 1:1 мелкомасштабной производственной среды, конфигурация немного отличается)

Имя процессораИСПроцессорПамятьсистемный дискдиск с даннымииспользовать
ksp-реестр192.168.9.904840200Зеркальный склад в порту
ксп-контроль-1192.168.9.914840100KubeSphere/k8s-управление-плоскостью
ksp-контроль-2192.168.9.924840100KubeSphere/k8s-управление-плоскостью
ксп-контроль-3192.168.9.934840100KubeSphere/k8s-управление-плоскостью
ksp-работник-1192.168.9.9441640100k8s-worker/CI
ksp-работник-2192.168.9.9541640100k8s-работник
ksp-работник-3192.168.9.9641640100k8s-работник
ksp-хранилище-1192.168.9.974840300+ElasticSearch/Ceph/Longhorn/NFS/
ksp-хранилище-2192.168.9.984840300+ElasticSearch//Ceph/Longhorn
ksp-хранилище-3192.168.9.994840300+ElasticSearch//Ceph/Longhorn
ksp-gpu-worker-1192.168.9.10141640100k8s-worker(ГП NVIDIA Tesla M40 24G)
ksp-gpu-worker-2192.168.9.10241640100k8s-worker(ГП NVIDIA Tesla P100 16G)
ksp-шлюз-1192.168.9.1032440Самостоятельно созданный прокси-шлюз/VIP службы приложений: 192.168.9.100
ksp-шлюз-2192.168.9.1042440Самостоятельно созданный прокси-шлюз/VIP службы приложений: 192.168.9.100
ксп-мид192.168.9.1054840100Сервисные узлы, развернутые за пределами кластера k8s (Gitlab и т. д.)
общий15561526002000

Реальная боевая среда включает информацию о версии программного обеспечения.

  • Операционная система:openEuler 22.03 LTS SP3 x86_64
  • Кубесфера:версия 3.4.1
  • Кубернетес:v1.28.8
  • KubeKey: версия 3.1.1
  • Контейнер:1.7.13
  • Оператор графического процессора NVIDIA:v24.3.0
  • Драйвер видеокарты NVIDIA:550.54.15

1. Предварительные условия

1.1 Подготовьте рабочие узлы с видеокартами

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

  • Узел 1 оснащен видеокартой NVIDIA Tesla M40 24G. Единственное преимущество — 24G большой видеопамяти и низкая производительность.
  • Узел 2 оснащен видеокартой NVIDIA Tesla P100 16G. Видеопамять небольшая, но скорость выше, чем у M40, P40 и других видеокарт.

Хотя эти видеокарты не такие мощные, как модели высокого класса, их достаточно для большинства задач обучения и разработки. Учитывая ограниченные ресурсы, такая конфигурация дает мне ценные практические возможности для глубокого изучения ресурсов графического процессора в управлении кластерами Kubernetes. стратегии планирования.

1.2 Конфигурация инициализации операционной системы

Пожалуйста, обратитесь к Руководство по инициализации узла кластера Kubernetes openEuler 22.03 LTS SP3, завершите настройку инициализации операционной системы.

Руководство по первоначальной настройке не включает задачи обновления операционной системы. При инициализации системы в среде с доступом к Интернету необходимо обновить операционную систему, а затем перезапустить узел.

2. Используйте KubeKey для расширения рабочих узлов графического процессора.

Далее мы используем KubeKey, чтобы добавить новый добавленный узел GPU в существующий кластер Kubernetes. Весь процесс относительно прост и требует всего двух шагов.

  • Измените файл конфигурации кластера, используемый при развертывании KubeKey.
  • Выполните команду для добавления узлов

2.1 Изменение файла конфигурации кластера

На узле Control-1 переключитесь в каталог kubekey для развертывания и измените исходный файл конфигурации кластера. Имя, которое мы использовали в реальном бою, — ksp-v341-v1288.yaml, пожалуйста, измените его в соответствии с реальной ситуацией.

Основные моменты модификации:

  • Раздел spec.hosts: добавьте информацию о новом рабочем узле.
  • Раздел spec.roleGroups.worker: добавление информации о новом рабочем узле.

Модифицированный пример выглядит следующим образом:

apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
  name: opsxlab
spec:
  hosts:
  ......(保持不变)
  - {name: ksp-gpu-worker-1, address: 192.168.9.101, internalAddress: 192.168.9.101, user: root, password: "OpsXlab@2024"}
  - {name: ksp-gpu-worker-2, address: 192.168.9.102, internalAddress: 192.168.9.102, user: root, password: "OpsXlab@2024"}
  roleGroups:
    ......(保持不变)
    worker:
    ......(保持不变)
    - ksp-gpu-worker-1
    - ksp-gpu-worker-2

# 下面的内容保持不变
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.2 Используйте KubeKey для добавления узлов

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

$ kubectl get nodes -o wide
NAME            STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                       CONTAINER-RUNTIME
ksp-control-1   Ready    control-plane   24h   v1.28.8   192.168.9.91   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-2   Ready    control-plane   24h   v1.28.8   192.168.9.92   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-3   Ready    control-plane   24h   v1.28.8   192.168.9.93   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-1    Ready    worker          24h   v1.28.8   192.168.9.94   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-2    Ready    worker          24h   v1.28.8   192.168.9.95   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-3    Ready    worker          24h   v1.28.8   192.168.9.96   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Затем мы выполняем следующую команду и используем измененный файл конфигурации, чтобы добавить новый рабочий узел в кластер.

export KKZONE=cn
./kk add nodes -f ksp-v341-v1288.yaml
  • 1

После выполнения вышеуказанной команды KubeKey сначала проверяет, соответствуют ли зависимости и другие конфигурации для развертывания Kubernetes требованиям. После прохождения проверки вам будет предложено подтвердить установку.входитьда и нажмите ENTER, чтобы продолжить развертывание.

Завершение развертывания занимает около 5 минут. Конкретное время зависит от скорости сети, конфигурации машины и количества добавленных узлов.

После завершения развертывания вы должны увидеть на своем терминале вывод, аналогичный следующему.

......
19:29:26 CST [AutoRenewCertsModule] Generate k8s certs renew script
19:29:27 CST success: [ksp-control-2]
19:29:27 CST success: [ksp-control-1]
19:29:27 CST success: [ksp-control-3]
19:29:27 CST [AutoRenewCertsModule] Generate k8s certs renew service
19:29:29 CST success: [ksp-control-3]
19:29:29 CST success: [ksp-control-2]
19:29:29 CST success: [ksp-control-1]
19:29:29 CST [AutoRenewCertsModule] Generate k8s certs renew timer
19:29:30 CST success: [ksp-control-2]
19:29:30 CST success: [ksp-control-1]
19:29:30 CST success: [ksp-control-3]
19:29:30 CST [AutoRenewCertsModule] Enable k8s certs renew service
19:29:30 CST success: [ksp-control-3]
19:29:30 CST success: [ksp-control-2]
19:29:30 CST success: [ksp-control-1]
19:29:30 CST Pipeline[AddNodesPipeline] execute successfully
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3. Проверка состояния кластера после расширения

3.1 Консоль управления KubeSphere для проверки состояния кластера

Открываем браузер и получаем доступ к IP-адресу и порту узла Control-1. 30880, войдите на страницу входа в консоль управления KubeSphere.

Войдите в интерфейс управления кластером, щелкните меню «Узел» слева и нажмите «Узел кластера», чтобы просмотреть подробную информацию о доступных узлах кластера Kubernetes.

3.2 Командная строка Kubectl для проверки состояния кластера

  • Просмотр информации об узле кластера

Запустите команду kubectl на узле Control-1, чтобы получить информацию об узле кластера Kubernetes.

kubectl get nodes -o wide

    Как вы можете видеть в выводе, текущий кластер Kubernetes имеет 8 узлов, и имя, статус, роль, время существования, номер версии Kubernetes, внутренний IP-адрес, тип операционной системы, версия ядра и время выполнения контейнера каждого узла отображаются подробно. и другая информация.

    $ kubectl get nodes -o wide
    NAME               STATUS     ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                        CONTAINER-RUNTIME
    ksp-control-1      Ready      control-plane   25h   v1.28.8   192.168.9.91    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-control-2      Ready      control-plane   25h   v1.28.8   192.168.9.92    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-control-3      Ready      control-plane   25h   v1.28.8   192.168.9.93    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-gpu-worker-1   Ready      worker          59m   v1.28.8   192.168.9.101   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-199.0.0.112.oe2203sp3.x86_64   containerd://1.7.13
    ksp-gpu-worker-2   Ready      worker          59m   v1.28.8   192.168.9.102   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-199.0.0.112.oe2203sp3.x86_64   containerd://1.7.13
    ksp-worker-1       Ready      worker          25h   v1.28.8   192.168.9.94    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-worker-2       Ready      worker          25h   v1.28.8   192.168.9.95    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-worker-3       Ready      worker          25h   v1.28.8   192.168.9.96    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    На данный момент мы выполнили все задачи по использованию Kubekey для добавления 2 рабочих нод в существующий кластер Kubernetes, состоящий из 3 главных нод и 3 рабочих нод.

    Затем мы устанавливаем оператор NVIDIA GPU, официально выпущенный NVIDIA, чтобы реализовать модуль планирования K8 для использования ресурсов графического процессора.

    4. Установите и настройте оператор NVIDIA GPU.

    4.1 Установите драйвер видеокарты NVIDIA

    Оператор NVIDIA GPU поддерживает автоматическую установку графического драйвера, но только CentOS 7, 8 и Ubuntu 20.04, 22.04 и другие версии не поддерживают openEuler, поэтому вам необходимо установить графический драйвер вручную.

    Пожалуйста, обратитесь к Лучшая практика KubeSphere: openEuler 22.03 LTS SP3 устанавливает драйвер видеокарты NVIDIA, завершите установку драйвера видеокарты.

    4.2 Предварительные условия

    Обнаружение функций узла (NFD) обнаруживает проверки функций.

     $ kubectl get nodes -o json | jq '.items[].metadata.labels | keys | any(startswith("feature.node.kubernetes.io"))'

      Результат выполнения приведенной выше команды: true, проиллюстрировать NFD Уже работает в кластере. Если NFD уже запущен в кластере, развертывание NFD необходимо отключить при установке оператора.

      проиллюстрировать: Кластеры K8s, развернутые с помощью KubeSphere, по умолчанию не будут устанавливать и настраивать NFD.

      4.3 Установка оператора графического процессора NVIDIA

      1. Добавить репозиторий NVIDIA Helm
      helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
        1. Установить оператора графического процессора

        Используйте файл конфигурации по умолчанию, отключите автоматическую установку драйверов видеокарты и установите Оператор графического процессора.

        helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false

          Примечание. Поскольку установленный образ относительно большой, во время первоначальной установки может возникнуть тайм-аут. Проверьте, успешно ли получен ваш образ! Для решения проблемы такого типа можно рассмотреть возможность использования автономной установки.

          1. Установите оператор графического процессора с пользовательскими значениями (Опционально, используется в автономном режиме или для индивидуальной конфигурации.
          helm install -f gpu-operator-values.yaml -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false

            Выходной результат правильного выполнения следующий:

            $ helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false
            NAME: gpu-operator
            LAST DEPLOYED: Tue Jul  2 21:40:29 2024
            NAMESPACE: gpu-operator
            STATUS: deployed
            REVISION: 1
            TEST SUITE: None
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6

            4.4. Проверка статуса развертывания оператора графического процессора с помощью командной строки

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

            1. Проверьте статус модулей из командной строки
            $ kubectl get pods -n gpu-operator
            NAME                                                          READY   STATUS      RESTARTS   AGE
            gpu-feature-discovery-czdf5                                   1/1     Running     0          15m
            gpu-feature-discovery-q9qlm                                   1/1     Running     0          15m
            gpu-operator-67c68ddccf-x29pm                                 1/1     Running     0          15m
            gpu-operator-node-feature-discovery-gc-57457b6d8f-zjqhr       1/1     Running     0          15m
            gpu-operator-node-feature-discovery-master-5fb74ff754-fzbzm   1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-68459              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-74ps5              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-dpmg9              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-jvk4t              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-k5kwq              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-ll4bk              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-p4q5q              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-rmk99              1/1     Running     0          15m
            nvidia-container-toolkit-daemonset-9zcnj                      1/1     Running     0          15m
            nvidia-container-toolkit-daemonset-kcz9g                      1/1     Running     0          15m
            nvidia-cuda-validator-l8vjb                                   0/1     Completed   0          14m
            nvidia-cuda-validator-svn2p                                   0/1     Completed   0          13m
            nvidia-dcgm-exporter-9lq4c                                    1/1     Running     0          15m
            nvidia-dcgm-exporter-qhmkg                                    1/1     Running     0          15m
            nvidia-device-plugin-daemonset-7rvfm                          1/1     Running     0          15m
            nvidia-device-plugin-daemonset-86gx2                          1/1     Running     0          15m
            nvidia-operator-validator-csr2z                               1/1     Running     0          15m
            nvidia-operator-validator-svlc4                               1/1     Running     0          15m
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
            • 19
            • 20
            • 21
            • 22
            • 23
            • 24
            1. Просмотр ресурсов графического процессора, которые может выделить узел
            $ kubectl describe node ksp-gpu-worker-1 | grep "^Capacity" -A 7
            Capacity:
              cpu:                4
              ephemeral-storage:  35852924Ki
              hugepages-1Gi:      0
              hugepages-2Mi:      0
              memory:             15858668Ki
              nvidia.com/gpu:     1
              pods:               110
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8

            проиллюстрировать: Фокусnvidia.com/gpu: Значение поля.

            4.5. Проверьте статус развертывания оператора графического процессора на консоли KubeSphere.

            Успешно созданная рабочая нагрузка выглядит следующим образом:

            • Развертывания

            • Демонсеты

            5. Проверка работоспособности графического процессора.

            5.1 Пример теста 1 – Верификационный тест CUDA

            После правильной установки оператора графического процессора используйте базовый образ CUDA, чтобы проверить, может ли K8 правильно создавать модули, использующие ресурсы графического процессора.

            1. Создайте файл манифеста ресурса,vi cuda-ubuntu.yaml
            apiVersion: v1
            kind: Pod
            metadata:
              name: cuda-ubuntu2204
            spec:
              restartPolicy: OnFailure
              containers:
              - name: cuda-ubuntu2204
                image: "nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04"
                resources:
                  limits:
                    nvidia.com/gpu: 1
                command: ["nvidia-smi"]
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            1. Создавайте ресурсы
            kubectl apply -f cuda-ubuntu.yaml
              1. Просмотр созданных ресурсов

              По результатам видно, что под создан на узле ksp-gpu-worker-2 (Модель узла видеокарты Tesla P100-PCIE-16GB)。

              $ kubectl get pods -o wide
              NAME                      READY   STATUS      RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
              cuda-ubuntu2204           0/1     Completed   0          73s   10.233.99.15   ksp-gpu-worker-2   <none>           <none>
              ollama-79688d46b8-vxmhg   1/1     Running     0          47m   10.233.72.17   ksp-gpu-worker-1   <none>           <none>
              • 1
              • 2
              • 3
              1. Просмотр журналов модуля
              kubectl logs pod/cuda-ubuntu2204

                Выходной результат правильного выполнения следующий:

                $ kubectl logs pod/cuda-ubuntu2204
                Mon Jul  8 11:10:59 2024
                +-----------------------------------------------------------------------------------------+
                | NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
                |-----------------------------------------+------------------------+----------------------+
                | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
                | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
                |                                         |                        |               MIG M. |
                |=========================================+========================+======================|
                |   0  Tesla P100-PCIE-16GB           Off |   00000000:00:10.0 Off |                    0 |
                | N/A   40C    P0             26W /  250W |       0MiB /  16384MiB |      0%      Default |
                |                                         |                        |                  N/A |
                +-----------------------------------------+------------------------+----------------------+
                
                +-----------------------------------------------------------------------------------------+
                | Processes:                                                                              |
                |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
                |        ID   ID                                                               Usage      |
                |=========================================================================================|
                |  No running processes found                                                             |
                +-----------------------------------------------------------------------------------------+
                • 1
                • 2
                • 3
                • 4
                • 5
                • 6
                • 7
                • 8
                • 9
                • 10
                • 11
                • 12
                • 13
                • 14
                • 15
                • 16
                • 17
                • 18
                • 19
                • 20
                1. Очистка тестовых ресурсов
                kubectl apply -f cuda-ubuntu.yaml

                  5.2 Пример теста 2. Пример использования официального графического процессора.

                  Реализуйте простой пример CUDA для добавления двух векторов.

                  1. Создайте файл манифеста ресурса,vi cuda-vectoradd.yaml
                  apiVersion: v1
                  kind: Pod
                  metadata:
                    name: cuda-vectoradd
                  spec:
                    restartPolicy: OnFailure
                    containers:
                    - name: cuda-vectoradd
                      image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"
                      resources:
                        limits:
                          nvidia.com/gpu: 1
                  • 1
                  • 2
                  • 3
                  • 4
                  • 5
                  • 6
                  • 7
                  • 8
                  • 9
                  • 10
                  • 11
                  1. Выполните команду для создания Pod
                  $ kubectl apply -f cuda-vectoradd.yaml
                    1. Просмотр результатов выполнения модуля

                    Под успешно создан и будет запущен после запуска. vectorAdd команду и выход.

                    $ kubectl logs pod/cuda-vectoradd

                      Выходной результат правильного выполнения следующий:

                      [Vector addition of 50000 elements]
                      Copy input data from the host memory to the CUDA device
                      CUDA kernel launch with 196 blocks of 256 threads
                      Copy output data from the CUDA device to the host memory
                      Test PASSED
                      Done
                      • 1
                      • 2
                      • 3
                      • 4
                      • 5
                      1. Очистка тестовых ресурсов
                      kubectl delete -f cuda-vectoradd.yaml

                        6. KubeSphere развертывает Ollama

                        С помощью приведенного выше проверочного теста доказано, что ресурсы Pod с использованием графического процессора могут быть созданы в кластере K8s. Затем мы используем KubeSphere для создания большого инструмента управления моделями Ollama в кластере K8s на основе фактических требований использования.

                        6.1 Создайте список ресурсов развертывания

                        Этот пример представляет собой простой тест, и хранилище выбрано hostPath Mode, замените его на класс хранилища или другие типы постоянного хранилища, которые используются в реальности.

                        1. Создайте список ресурсов,vi deploy-ollama.yaml
                        kind: Deployment
                        apiVersion: apps/v1
                        metadata:
                          name: ollama
                          namespace: default
                          labels:
                            app: ollama
                        spec:
                          replicas: 1
                          selector:
                            matchLabels:
                              app: ollama
                          template:
                            metadata:
                              labels:
                                app: ollama
                            spec:
                              volumes:
                                - name: ollama-models
                                  hostPath:
                                    path: /data/openebs/local/ollama
                                    type: ''
                                - name: host-time
                                  hostPath:
                                    path: /etc/localtime
                                    type: ''
                              containers:
                                - name: ollama
                                  image: 'ollama/ollama:latest'
                                  ports:
                                    - name: http-11434
                                      containerPort: 11434
                                      protocol: TCP
                                  resources:
                                    limits:
                                      nvidia.com/gpu: '1'
                                    requests:
                                      nvidia.com/gpu: '1'
                                  volumeMounts:
                                    - name: ollama-models
                                      mountPath: /root/.ollama
                                    - name: host-time
                                      readOnly: true
                                      mountPath: /etc/localtime
                                  imagePullPolicy: IfNotPresent
                              restartPolicy: Always
                        ---
                        kind: Service
                        apiVersion: v1
                        metadata:
                          name: ollama
                          namespace: default
                          labels:
                            app: ollama
                        spec:
                          ports:
                            - name: http-11434
                              protocol: TCP
                              port: 11434
                              targetPort: 11434
                              nodePort: 31434
                          selector:
                            app: ollama
                          type: NodePort
                        • 1
                        • 2
                        • 3
                        • 4
                        • 5
                        • 6
                        • 7
                        • 8
                        • 9
                        • 10
                        • 11
                        • 12
                        • 13
                        • 14
                        • 15
                        • 16
                        • 17
                        • 18
                        • 19
                        • 20
                        • 21
                        • 22
                        • 23
                        • 24
                        • 25
                        • 26
                        • 27
                        • 28
                        • 29
                        • 30
                        • 31
                        • 32
                        • 33
                        • 34
                        • 35
                        • 36
                        • 37
                        • 38
                        • 39
                        • 40
                        • 41
                        • 42
                        • 43
                        • 44
                        • 45
                        • 46
                        • 47
                        • 48
                        • 49
                        • 50
                        • 51
                        • 52
                        • 53
                        • 54
                        • 55
                        • 56
                        • 57
                        • 58
                        • 59
                        • 60
                        • 61
                        • 62
                        • 63

                        Специальные инструкции: Консоль управления KubeSphere поддерживает графическую настройку развертывания и других ресурсов для использования ресурсов графического процессора. Заинтересованные друзья могут изучить их самостоятельно.

                        6.2 Развертывание службы Оллама

                        • Создать Олламу
                        kubectl apply -f deploy-ollama.yaml
                          • Посмотреть результаты создания модуля

                          По результатам видно, что под создан на узле ksp-gpu-worker-1 (Модель узла видеокарты Tesla M40 24GB)。

                          $ kubectl get pods -o wide
                          NAME                      READY   STATUS    RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
                          k   1/1     Running   0          12s   10.233.72.17   ksp-gpu-worker-1   <none>           <none>
                          • 1
                          • 2
                          • Посмотреть журнал контейнера
                          [root@ksp-control-1 ~]# kubectl logs ollama-79688d46b8-vxmhg
                          2024/07/08 18:24:27 routes.go:1064: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE: OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:1 OLLAMA_MAX_QUEUE:512 OLLAMA_MAX_VRAM:0 OLLAMA_MODELS:/root/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:1 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_RUNNERS_DIR: OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES:]"
                          time=2024-07-08T18:24:27.829+08:00 level=INFO source=images.go:730 msg="total blobs: 5"
                          time=2024-07-08T18:24:27.829+08:00 level=INFO source=images.go:737 msg="total unused blobs removed: 0"
                          time=2024-07-08T18:24:27.830+08:00 level=INFO source=routes.go:1111 msg="Listening on [::]:11434 (version 0.1.48)"
                          time=2024-07-08T18:24:27.830+08:00 level=INFO source=payload.go:30 msg="extracting embedded files" dir=/tmp/ollama2414166698/runners
                          time=2024-07-08T18:24:32.454+08:00 level=INFO source=payload.go:44 msg="Dynamic LLM libraries [cpu cpu_avx cpu_avx2 cuda_v11 rocm_v60101]"
                          time=2024-07-08T18:24:32.567+08:00 level=INFO source=types.go:98 msg="inference compute" id=GPU-9e48dc13-f8f1-c6bb-860f-c82c96df22a4 library=cuda compute=5.2 driver=12.4 name="Tesla M40 24GB" total="22.4 GiB" available="22.3 GiB"
                          • 1
                          • 2
                          • 3
                          • 4
                          • 5
                          • 6
                          • 7

                          6.3. Вытащите большую модель, которую использовал Оллама.

                          • Модель вытягивания Олламы

                          Чтобы сэкономить время, в этом примере в качестве тестовой модели используется малоразмерная модель qwen2 1.5b с открытым исходным кодом от Alibaba.

                          kubectl exec -it ollama-79688d46b8-vxmhg -- ollama pull qwen2:1.5b

                            Выходной результат правильного выполнения следующий:

                            [root@ksp-control-1 ~]# kubectl exec -it ollama-79688d46b8-vxmhg -- ollama pull qwen2:1.5b
                            pulling manifest
                            pulling 405b56374e02... 100% ▕█████████████████████████████████████████████████████▏ 934 MB
                            pulling 62fbfd9ed093... 100% ▕█████████████████████████████████████████████████████▏  182 B
                            pulling c156170b718e... 100% ▕█████████████████████████████████████████████████████▏  11 KB
                            pulling f02dd72bb242... 100% ▕█████████████████████████████████████████████████████▏   59 B
                            pulling c9f5e9ffbc5f... 100% ▕█████████████████████████████████████████████████████▏  485 B
                            verifying sha256 digest
                            writing manifest
                            removing any unused layers
                            success
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • Просмотр содержимого файла модели

                            существовать ksp-gpu-worker-1 Узел выполняет следующую команду просмотра

                            $ ls -R /data/openebs/local/ollama/
                            /data/openebs/local/ollama/:
                            id_ed25519  id_ed25519.pub  models
                            
                            /data/openebs/local/ollama/models:
                            blobs  manifests
                            
                            /data/openebs/local/ollama/models/blobs:
                            sha256-405b56374e02b21122ae1469db646be0617c02928fd78e246723ebbb98dbca3e
                            sha256-62fbfd9ed093d6e5ac83190c86eec5369317919f4b149598d2dbb38900e9faef
                            sha256-c156170b718ec29139d3653d40ed1986fd92fb7e0959b5c71f3c48f62e6636f4
                            sha256-c9f5e9ffbc5f14febb85d242942bd3d674a8e4c762aaab034ec88d6ba839b596
                            sha256-f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216
                            
                            /data/openebs/local/ollama/models/manifests:
                            registry.ollama.ai
                            
                            /data/openebs/local/ollama/models/manifests/registry.ollama.ai:
                            library
                            
                            /data/openebs/local/ollama/models/manifests/registry.ollama.ai/library:
                            qwen2
                            
                            /data/openebs/local/ollama/models/manifests/registry.ollama.ai/library/qwen2:
                            1.5b
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17
                            • 18
                            • 19
                            • 20
                            • 21
                            • 22
                            • 23
                            • 24

                            6.4 Проверка возможностей модели

                            • Тест интерфейса вызова
                            curl http://192.168.9.91:31434/api/chat -d '{
                              "model": "qwen2:1.5b",
                              "messages": [
                                { "role": "user", "content": "用20个字,介绍你自己" }
                              ]
                            }'
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • Результаты теста
                            $ curl http://192.168.9.91:31434/api/chat -d '{
                              "model": "qwen2:1.5b",
                              "messages": [
                                { "role": "user", "content": "用20个字,介绍你自己" }
                              ]
                            }'
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.011798927Z","message":{"role":"assistant","content":"我"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.035291669Z","message":{"role":"assistant","content":"是一个"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.06360233Z","message":{"role":"assistant","content":"人工智能"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.092411266Z","message":{"role":"assistant","content":"助手"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.12016935Z","message":{"role":"assistant","content":","},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.144921623Z","message":{"role":"assistant","content":"专注于"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.169803961Z","message":{"role":"assistant","content":"提供"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.194796364Z","message":{"role":"assistant","content":"信息"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.21978104Z","message":{"role":"assistant","content":"和"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.244976103Z","message":{"role":"assistant","content":"帮助"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.270233992Z","message":{"role":"assistant","content":"。"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.29548561Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":454377627,"load_duration":1535754,"prompt_eval_duration":36172000,"eval_count":12,"eval_duration":287565000}
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17

                            6.5 Просмотр информации о распределении графического процессора

                            • Просмотр выделенных ресурсов графического процессора рабочего узла
                            $ kubectl describe node ksp-gpu-worker-1 | grep "Allocated resources" -A 9
                            Allocated resources:
                              (Total limits may be over 100 percent, i.e., overcommitted.)
                              Resource           Requests        Limits
                              --------           --------        ------
                              cpu                487m (13%)      2 (55%)
                              memory             315115520 (2%)  800Mi (5%)
                              ephemeral-storage  0 (0%)          0 (0%)
                              hugepages-1Gi      0 (0%)          0 (0%)
                              hugepages-2Mi      0 (0%)          0 (0%)
                              nvidia.com/gpu     1               1
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • Использование физического графического процессора во время выполнения Ollama

                            Выполнить на рабочем узле nvidia-smi -l Наблюдайте за использованием графического процессора.

                            Отказ от ответственности:

                            • Уровень автора ограничен, хотя он прошел множество проверок и проверок и старался изо всех сил обеспечить точность содержания.Однако могут быть и пропуски . Пожалуйста, не стесняйтесь давать нам советы от экспертов отрасли.
                            • Содержание, описанное в этой статье, было проверено и протестировано только в реальных боевых условиях. Читатели могут учиться и учиться на нем, но.Категорически запрещено использовать непосредственно в производственной среде.Автор не несет ответственности за любые проблемы, возникшие в связи с этим.

                            Эта статья опубликована мультипубликационной платформой Blog One Post. ОткрытьЗаписать выпускать!