Привет! Сегодня расскажу вам сагу о том, как мы искали дешёвые AI-мощности для своего проекта и чуть не сошли с ума. Спойлер: спас нас Китай, но эта помощь стоила нам седых волос и нескольких лет жизни. Делюсь опытом, чтобы вы прошли этот путь быстрее.
Меня зовут Михаил, я работаю в компании VizoGEN на позиции CTO и вся история ниже - наш путь.
Пролог: Скромные запросы и растущие аппетиты
Всё начиналось невинно. Как и у многих, наш стек AI-инструментов (полный список — военная тайна, сорян, NDA) на этапе гипотез скромно кушал с 3080 TI. Потом пошло-поехало: 4080, а там и до 4090 TI рукой подать.
Но настоящий щелчок по носу случился, когда наши модели перевалили за 55 ГБ видеопамяти. Мinimum viable product внезапно потребовал maximum viable hardware.
Первая мысль — спаять несколько карт в кучу. Ан нет! Наш основной инструмент, ComfyUI, как оказалось, крайне криво работает с несколькими GPU. Одна карта — генератор, остальные — дорогущие костыли для видеопамяти. Экономика проекта плакала и просила пощады.
Акт 1: Просветление и первый шок
Осознание было жестоким: нужны промышленные монстры — серверные карты Nvidia Tesla. Мы, как добропорядочные ребята, пошли к цивилизованным провайдерам. Взяли на тест H100 у immers клауда.
Мощность — огонь! Скорость — космос! Счет... тоже космос. Скромные прикидочные расчеты на сервер с 8 картами показали $18-19K в месяц. Только на R&D! Мы не Илон Маск, чтобы так жечь деньги.
Акт 2: Восток — дело тонкое (и дешёвое)
Когда все дороги ведут в финансовый тупик, умный человек смотрит на Восток. В нашем случае — на Китай.
Да, есть нюансы. Из-за экспортных ограничений арендовать полноценную H100 не выйдет. Но китайцы, как всегда, нашли выход — урезанная, но всё ещё очень мощная H20. И главное — цена в несколько раз дешевле местных провайдеров. Мы потеплели душой и ринулись в бой.
Наивные.
Акт 3: Ад развертывания, или Добро пожаловать за Великий Фаервол
Мы думали, что взяли сервер. На самом деле мы купили билет в аттракцион невиданной жестокости под названием «Настройка окружения в КНР».
-
Проблема №1: Доставка образа. Вы когда-нибудь пытались загрузить образ ПО на 50+ ГБ на китайский сервер? Великий Фаервол Китая режет скорость так, будто вы качаете интернет через два консервных провода. Это был день… нет, два дня медитативного ожидания.
-
Проблема №2: Мир без GitHub и Pip. Представьте: вы привыкли, что воздух бесплатный, а тут вам его перекрыли. В Китае нет доступа к привычным
pip installиgit clone. Все ваши скрипты установки превращаются в тыкву. Зеркала есть, но это ловушка для самоуверенных.
Важное экспертное отступление: Если в оригинальном репозитории версия библиотеки 2.3.5 и в китайском зеркале — 2.3.5, это НЕ ОЗНАЧАЕТ, что это один и тот же файл. Всегда проверяйте хеши. Будьте параноиком: в зависимостях могут быть инъекции. Ваша безопасность — только ваша забота.
-
Проблема №3: Волшебный пинок и китайский язык. Решение пришло с неожиданной стороны. Спасибо сотрудникам Tencent Cloud, которые реально пытались помочь. Да, для этого пришлось включить Duolingo и поднапрячься с китайским, но это того стоило. Вывод: иногда прямой человеческий контакт решает то, что не могут решить технологии.
Акт 4: Драйвера, или «Совместимо» не значит «Работает»
Вы думали, что после настройки сети всё заработает? Как бы не так!
С H20 есть своя магия. Даже если официальная документация кричит о совместимости версий драйверов CUDA и вашего софта — это ложь. Нужно подбирать драйвера и версии библиотек методом тыка, по факту работы. Особенно nvidia-ctk.
Экспертный лайфхак: Если используете контейнеры (Docker), ваша главная задача — убедиться, что инстансы ВНУТРИ контейнера видят CUDA. Внешняя совместимость хоста — это лишь полдела. Потратили на эту магию еще пару дней.
Эпилог: Итоги и выводы для страждущих
Итак, спустя 4 дня битвы, окружение завелось. Мощности — в несколько раз дешевле. Нервы — частично восстановлены.
Резюме для тех, кто ищет дешёвые AI-мощности:
-
Вариант А: Китай. Это дёшево, но будьте готовы к:
-
Битве с Фаерволом и скоростью.
-
Отсутствию прямого доступа к GitHub и Pip.
-
Тщательной проверке всех зависимостей из зеркал.
-
Танцам с бубном вокруг драйверов и совместимости.
-
Языковому барьеру (но он преодолим).
-
-
Вариант Б: Складчина. Если нет ресурсов бороться с китайской спецификой, ищите единомышленников и скидывайтесь на сервер вместе. Менее гибко, зато голова не болит.
Наш выбор в данной ситуации — Китай. Да, это хардкор. Но когда вопрос стоит между «вообще никак» и «сложно, но можно», мы выбираем второе.
Надеюсь, наш опыт сэкономит вам не только деньги, но и пару тысяч нервных клеток. Делитесь своими историями выживания в комментариях!
P.S. Если встретите в Пекине человека, который матерится на русском, устанавливая PyTorch, — это, возможно, наш DevOps. Передайте ему привет.
И немного полезных вам скриптов, надеюсь окажутся вам полезными.
# Удаление всех драйверов и зависимостей
sudo apt purge nvidia cuda libcuda -y
sudo apt autoremove -y
sudo rm -rf /usr/local/cuda* ~/.nv/
sudo find /usr -name "nvidia" -exec rm -rf {} ;
sudo find /usr -name "cuda" -exec rm -rf {} ;
# Поиск, если вдруг где-то что-то осталось
sudo find / -type f -name "nvidia" 2>/dev/null
sudo find / -type f -name "cuda" 2>/dev/null
sudo find / -type d -name "nvidia" 2>/dev/null
sudo find / -type d -name "cuda" 2>/dev/null
# Получение статуса по установленным зависимостям
python3 -c "import torch; print(f'PyTorch version: {torch.version}');
print(f'CUDA available: {torch.cuda.is_available()}');
print(f'GPU count: {torch.cuda.device_count()}');
print(f'Current device: {torch.cuda.current_device()}');
print(f'Device name: {torch.cuda.get_device_name(0)}')"
#Пример ответа
PyTorch version: 2.7.1+cu126
CUDA available: True
GPU count: 8
Current device: 0
Device name: NVIDIA H20
# Общий скрипт проверки, назовем его test.py
import os
import torch
print("1. Проверка переменных окружения:")
print(f"LD_LIBRARY_PATH: {os.getenv('LD_LIBRARY_PATH')}")
print(f"PATH: {os.getenv('PATH')}")
print("n2. Прямой доступ к устройствам:")
try:
with open('/dev/nvidia0', 'rb') as f:
print("Успешное чтение /dev/nvidia0")
except Exception as e:
print(f"Ошибка доступа к /dev/nvidia0: {str(e)}")
print("n3. Низкоуровневая проверка CUDA:")
try:
from ctypes import cdll
libcuda = cdll.LoadLibrary('libcuda.so')
print("libcuda.so успешно загружена")
print(f"Версия драйвера: {libcuda.cuDriverGetVersion()}")
except Exception as e:
print(f"Ошибка загрузки libcuda.so: {str(e)}")
print("n4. Тест PyTorch:")
try:
print(f"PyTorch version: {torch.version}")
print(f"CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"GPU count: {torch.cuda.device_count()}")
print(f"Device 0: {torch.cuda.get_device_name(0)}")
except Exception as e:
print(f"Ошибка PyTorch: {str(e)}")
Автор: killersssurprise
