{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Андрей Крисанов: заметки с тегом gpu",
    "_rss_description": "Блог Андрея Крисанова о разработке в эпоху ИИ: прикладной ИИ, инфраструктура ИИ, ИИ-нативные продукты и управление инженерными командами.",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/agenticeng.ru\/tags\/gpu\/",
    "feed_url": "https:\/\/agenticeng.ru\/tags\/gpu\/json\/",
    "icon": "https:\/\/agenticeng.ru\/pictures\/userpic\/userpic@2x.jpg?1775503436",
    "authors": [
        {
            "name": "Андрей Крисанов",
            "url": "https:\/\/agenticeng.ru\/",
            "avatar": "https:\/\/agenticeng.ru\/pictures\/userpic\/userpic@2x.jpg?1775503436"
        }
    ],
    "items": [
        {
            "id": "6",
            "url": "https:\/\/agenticeng.ru\/all\/dcgm-exporter-k3s-wsl2\/",
            "title": "Установка DCGM Exporter в локальный Kubernetes-кластер с NVIDIA GPU",
            "content_html": "<p>В <a href=\"\/all\/wsl-nvidia-gpu\/\">предыдущей заметке<\/a> я рассказывал как развернуть локальный кластер Kubernetes с доступом к GPU внутри WSL2 окружения. Для того, чтобы собирать детальные метрики с видеокарты, <i>nvidia-smi<\/i> не достаточно, т. к. GPU-Util показывает только активность в рамках короткого sampling-окна. Для анализа того, что происходит с GPU при обработке задач, нужен DCGM. <a href=\"https:\/\/github.com\/NVIDIA\/dcgm-exporter\">dcgm-exporter<\/a> — это утилита NVIDIA для сбора GPU-метрик через DCGM, которая отдает их через HTTP-метод \/<i>metrics<\/i> для Prometheus и похожих систем мониторинга.<\/p>\n<p>При попытке установить <i>dcgm-exporter<\/i> в k3s кластер Helm chart по умолчанию создает <i>ServiceMonitor<\/i>. Но если в кластере не установлен Prometheus оператор, процесс завершится с ошибкой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">no matches for kind &quot;ServiceMonitor&quot; in version &quot;monitoring.coreos.com\/v1&quot;\nensure CRDs are installed first<\/code><\/pre><p>Это ожидаемое поведение. В dcgm-exporter chart по умолчанию <i>serviceMonitor.enabled: true<\/i>, а <i>ServiceMonitor<\/i> относится к CRD из экосистемы Prometheus Operator. В том же чарте <i>runtimeClassName<\/i> — пустой.<\/p>\n<p>Проверяем, что Kubernetes все еще видит GPU:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">kubectl get nodes -o json | jq &#039;.items[].status.allocatable&#039;<\/code><\/pre><p>На моей системе результат такой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"json\">{\n  &quot;cpu&quot;: &quot;20&quot;,\n  &quot;ephemeral-storage&quot;: &quot;1027046117185&quot;,\n  &quot;hugepages-1Gi&quot;: &quot;0&quot;,\n  &quot;hugepages-2Mi&quot;: &quot;0&quot;,\n  &quot;memory&quot;: &quot;16233644Ki&quot;,\n  &quot;nvidia.com\/gpu&quot;: &quot;1&quot;,\n  &quot;pods&quot;: &quot;110&quot;\n}<\/code><\/pre><p>Далее добавляем репозиторий:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">helm repo add gpu-helm-charts https:\/\/nvidia.github.io\/dcgm-exporter\/helm-charts\nhelm repo update<\/code><\/pre><p>Отключаем создание <i>ServiceMonitor<\/i> и указываем Nvidia runtime class:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">helm install dcgm-exporter gpu-helm-charts\/dcgm-exporter \\\n  --set serviceMonitor.enabled=false \\\n  --set runtimeClassName=nvidia<\/code><\/pre><p>Проверяем, что pod с экспортером поднялся:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">kubectl get pods -l app.kubernetes.io\/name=dcgm-exporter -o wide\nkubectl logs -l app.kubernetes.io\/name=dcgm-exporter --tail=50<\/code><\/pre><p>Успешный запуск выглядит примерно так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Starting dcgm-exporter\nAttempting to initialize DCGM.\nInitialized DCGM Fields module.\nAttempting to initialize NVML library.\nNVML provider successfully initialized for Kubernetes MIG support\nDCGM successfully initialized!\nSuccessfully queried DCGM profiling metric groups\nHTTP server started - ready to serve metrics\nListening on [::]:9400<\/code><\/pre><p>Это означает, что:<\/p>\n<ul>\n<li>DCGM инициализировался<\/li>\n<li>NVML инициализировался<\/li>\n<li>exporter увидел GPU<\/li>\n<li>HTTP endpoint с метриками уже работает<\/li>\n<\/ul>\n<p>Если chart создал сервис, его можно посмотреть так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">kubectl get svc<\/code><\/pre><p>Дальше пробрасываем порт:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">kubectl port-forward svc\/dcgm-exporter 9400:9400<\/code><\/pre><p>И проверяем:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">curl http:\/\/127.0.0.1:9400\/metrics | head -50\ncurl http:\/\/127.0.0.1:9400\/health<\/code><\/pre><p>Если все ок, \/<i>health<\/i> вернет успешный ответ, а \/<i>metrics<\/i> начнет отдавать метрики вида <i>DCGM_FI_*<\/i>.<\/p>\n",
            "summary": "Установка NVIDIA DCGM Exporter в локальный Kubernetes-кластер под WSL2: как обойти ошибку ServiceMonitor, настроить runtimeClassName и проверить сбор GPU-метрик.",
            "date_published": "2026-04-23T17:31:40+03:00",
            "date_modified": "2026-04-23T17:33:37+03:00",
            "tags": [
                "gpu",
                "kubernetes",
                "nvidia",
                "wsl2",
                "инфраструктура ИИ",
                "мониторинг"
            ],
            "_date_published_rfc2822": "Thu, 23 Apr 2026 17:31:40 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "6",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "5",
            "url": "https:\/\/agenticeng.ru\/all\/wsl-nvidia-gpu\/",
            "title": "Kubernetes с доступом к GPU внутри WSL2 на ноутбуке с RTX",
            "content_html": "<p>На днях мне понадобилась локальная среда c Kubernetes для запуска GPU задач и тестирования сервисов с ИИ. Мой рабочий компьютер — это ноутбук Lenovo Legion следующей конфигурации:<\/p>\n<ul>\n<li>Процессор 13th Gen Intel(R) Core(TM) i7-13650HX (2.60 GHz)<\/li>\n<li>Оперативная память 32 GB<\/li>\n<li>Видеокарта NVIDIA GeForce RTX 5070 Laptop GPU<\/li>\n<li>Диск 1 TB SSD<\/li>\n<\/ul>\n<p>Каждый раз арендовать облако и временно развертывать K8s-окружение, чтобы экономить на стоимости — не очень удобно. Поэтому я решил попробовать сконфигурировать локальную среду. Оказалось, что Kubernetes с доступом к GPU внутри WSL2 — это реально. Но есть несколько неочевидных нюансов, которые ломают рантайм.<\/p>\n<h3>TL;DR<\/h3>\n<p>Итоговый стек:<\/p>\n<ul>\n<li>Windows 11 + NVIDIA driver (с поддержкой WSL)<\/li>\n<li><a href=\"https:\/\/podman.io\/\">Podman<\/a><\/li>\n<li>WSL2 (Ubuntu 24.04)<\/li>\n<li>K3s (containerd)<\/li>\n<li>NVIDIA Container Toolkit<\/li>\n<li>NVIDIA device plugin<\/li>\n<li>фикс: <i>runtimeClassName: nvidia<\/i> для device plugin<\/li>\n<\/ul>\n<h3>Что хотелось получить<\/h3>\n<p>По сути — мини-кластер на ноутбуке, который работает по следующей схеме:<\/p>\n<p>Pod → Kubernetes → containerd → NVIDIA runtime → WSL GPU → Windows driver → RTX GPU<\/p>\n<p>С возможностью делать:<\/p>\n<ul>\n<li>локальный инференс<\/li>\n<li>эксперименты с AI-инфраструктурой и GPU<\/li>\n<\/ul>\n<h3>Шаг 1: Проверка GPU в WSL<\/h3>\n<p>Если после установки WSL2 у вас работает <a href=\"https:\/\/docs.nvidia.com\/deploy\/nvidia-smi\/index.html\">Nvidia System Management<\/a>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"console\">nvidia-smi<\/code><\/pre><p>— двигаемся дальше.<\/p>\n<h3>Шаг 2: Linux-драйверы<\/h3>\n<p>WSL — особенная штука. Драйвер для GPU живет в Windows, Linux просто проксирует доступ через \/<i>usr\/lib\/wsl<\/i><\/p>\n<p>Если nvidia-smi не находится:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">echo &#039;export PATH=$PATH:\/usr\/lib\/wsl\/lib&#039; &gt;&gt; ~\/.bashrc\nsource ~\/.bashrc<\/code><\/pre><p>Чего не стоит делать:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">apt install nvidia-utils-*<\/code><\/pre><p>Такая установка системных пакетов внутри Linux  почти гарантированно все сломает.<\/p>\n<h3>Шаг 3: Проверка GPU в контейнерах<\/h3>\n<p>Перед установкой Kubernetes важно убедиться, что GPU работает в контейнерах.<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">sudo nvidia-ctk cdi generate --output=\/etc\/cdi\/nvidia.yaml\npodman run --rm --device=nvidia.com\/gpu=all ubuntu nvidia-smi<\/code><\/pre><p>Если последняя команда выполняется успешно, то runtime настроен правильно.<\/p>\n<h3>Шаг 4: Установка K3s<\/h3>\n<pre class=\"e2-text-code\"><code class=\"shell\">curl -sfL https:\/\/get.k3s.io | sh -<\/code><\/pre><p>Настраиваем kubeconfig:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">mkdir -p ~\/.kube\nsudo cp \/etc\/rancher\/k3s\/k3s.yaml ~\/.kube\/config\nsudo chown $USER:$USER ~\/.kube\/config\nexport KUBECONFIG=~\/.kube\/config<\/code><\/pre><p>Проверяем доступна ли наша единственная Kubernetes нода:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">kubectl get nodes<\/code><\/pre><h3>Шаг 5: Подключение NVIDIA runtime<\/h3>\n<pre class=\"e2-text-code\"><code class=\"shell\">sudo nvidia-ctk runtime configure --runtime=containerd\nsudo systemctl restart k3s<\/code><\/pre><p>После перезапуска K3s убеждаемся, что поддержка GPU есть в конфиге:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">sudo grep nvidia \/var\/lib\/rancher\/k3s\/agent\/etc\/containerd\/config.toml<\/code><\/pre><h3>Шаг 6: Установка device plugin<\/h3>\n<pre class=\"e2-text-code\"><code class=\"shell\">kubectl apply -f \\\nhttps:\/\/raw.githubusercontent.com\/NVIDIA\/k8s-device-plugin\/v0.17.1\/deployments\/static\/nvidia-device-plugin.yml<\/code><\/pre><h3>NVIDIA runtime и device plugin<\/h3>\n<p>После выполнения шага 6 я столкнулся со следующей ситуацией вокруг device plugin — он запускается и не падает, но не видит GPU. В логах можно увидеть:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">No devices found. Waiting indefinitely.\nIncompatible strategy detected auto<\/code><\/pre><p>Причина такого поведения кроется в том, что device plugin запускается под обычным runtime (runc), а не под NVIDIA runtime. Т. е.:<\/p>\n<ul>\n<li>внутри pod’а нет CUDA \/ NVML<\/li>\n<li>GPU не может быть обнаружен<\/li>\n<li><i>nvidia.com\/gpu<\/i> не регистрируется<\/li>\n<\/ul>\n<p>Нужно заставить сам device plugin использовать NVIDIA runtime:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">kubectl patch daemonset nvidia-device-plugin-daemonset \\\n  -n kube-system \\\n  --type=&#039;merge&#039; \\\n  -p &#039;{&quot;spec&quot;:{&quot;template&quot;:{&quot;spec&quot;:{&quot;runtimeClassName&quot;:&quot;nvidia&quot;}}}}&#039;<\/code><\/pre><p>Перезапускаем pod:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">kubectl delete pod -n kube-system -l name=nvidia-device-plugin-ds<\/code><\/pre><p>и проверяем доступные GPU:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">kubectl get node -o jsonpath=&#039;{.status.capacity.nvidia\\.com\/gpu}&#039;<\/code><\/pre><p>Команда должна вернуть <i>1<\/i>.<\/p>\n<h3>Финальная проверка<\/h3>\n<p>Для тестирования работы GPU внутри WSL2 можно запустить следующий pod:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">cat &lt;&lt;&#039;EOF&#039; | kubectl apply -f -\napiVersion: v1\nkind: Pod\nmetadata:\n  name: cuda-smoke-test\nspec:\n  restartPolicy: Never\n  runtimeClassName: nvidia\n  containers:\n  - name: cuda\n    image: nvcr.io\/nvidia\/k8s\/cuda-sample:nbody\n    args: [&quot;nbody&quot;, &quot;-gpu&quot;, &quot;-benchmark&quot;]\n    resources:\n      limits:\n        nvidia.com\/gpu: 1\nEOF<\/code><\/pre><p>и проверить его состояние и логи:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">kubectl get pod cuda-smoke-test -w\nkubectl logs cuda-smoke-test<\/code><\/pre><h3>Что в итоге получилось<\/h3>\n<ul>\n<li>локальный Kubernetes на ноутбуке с Nvidia RTX 5070 (8GB vRAM)<\/li>\n<li>с возможность GPU scheduling<\/li>\n<li>тестирования задач с CUDA и LLM<\/li>\n<\/ul>\n<p>Такое окружение хорошо подходит для локального инференса LLM, экспериментов и обучения. Но его не стоит использовать для бенчмарков и более серьезных задач.<\/p>\n",
            "summary": "Локальный Kubernetes с GPU внутри WSL2: K3s + NVIDIA runtime + device plugin. Разбор проблемы с NVML\/device discovery и практическое решение через runtimeClass.",
            "date_published": "2026-04-22T11:57:42+03:00",
            "date_modified": "2026-04-22T12:03:41+03:00",
            "tags": [
                "gpu",
                "kubernetes",
                "nvidia",
                "windows",
                "wsl2",
                "инфраструктура ИИ"
            ],
            "_date_published_rfc2822": "Wed, 22 Apr 2026 11:57:42 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "5",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4199,
    "_e2_ua_string": "Aegea 11.5 (v4199)"
}