В чем разница запуска модели на CPU и GPU
Что проверяют
Понимаете ли вы, почему нейросети считают на GPU и в каких случаях это правило не работает. Следом почти всегда спрашивают: когда вы оставите инференс на CPU и как честно сравнить скорость двух вариантов.
Как отвечать
Начните с архитектуры, потом переходите к практике:
- CPU: от единиц до десятков мощных ядер с большими кешами и предсказанием ветвлений. Хорош для последовательной логики, препроцессинга, классического ML. Векторные инструкции (AVX2, AVX-512) дают параллелизм, но скромный;
- GPU: тысячи простых ядер, которые выполняют одну инструкцию над множеством данных. Нейросеть это в основном умножение матриц, и оно параллелится идеально. Плюс высокая пропускная способность памяти и тензорные ядра для FP16, BF16, INT8;
- передача данных: тензоры идут в видеопамять через PCIe, и это дорого. Поэтому данные гоняют батчами, в
DataLoaderвключаютpin_memory=True, а модель и вход держат на одном устройстве; - память: видеопамяти мало. Веса модели на 7 млрд параметров в FP16 занимают около 14 ГБ, при обучении добавляются активации, градиенты и состояние оптимизатора;
- размер батча: выигрыш GPU растёт с батчем. На одном объекте и маленькой модели накладные расходы на запуск ядер и копирование съедают преимущество.
Отдельно скажите про инференс на CPU: квантизация в INT8, ONNX Runtime или OpenVINO, llama.cpp для LLM. Для градиентного бустинга на табличных данных CPU часто достаточно, хотя у XGBoost, LightGBM и CatBoost есть режимы на GPU.
Где спотыкаются
Говорят «GPU всегда быстрее». Для модели на пару мегабайт с запросами по одному CPU может дать меньшую задержку и обойтись дешевле.
Неправильно замеряют время. CUDA работает асинхронно: без torch.cuda.synchronize() вы измеряете постановку задачи в очередь, а первый прогон включает инициализацию контекста, поэтому нужен прогрев.
Не замечают, что GPU простаивает. Если nvidia-smi показывает загрузку 30%, узкое место обычно в подготовке данных на CPU: мало num_workers, тяжёлые аугментации, медленный диск.