Развертывание LLM на конечной точке Sagemaker — CUDA не хватает памяти

Я пытаюсь развернуть Huggingface LLM (для вывода) в конечной точке Sagemaker, используя специальные сценарии (используя структуру Pytorch с моделью и сценарием вывода, заархивированными как файл .tar.gz). Структура файла tar.gz:

model.tar.gz/
|- pytorch_model.bin
|- ....
|- code/
  |- inference.py
  |- requirements.txt 

В inference.py я определил функции model_fn и Predict_fn.

Этот файл tar.gz загружается в S3, и модель во время развертывания выбирается из этого местоположения S3.

Я выполнил процесс, определенный в https://huggingface.co/docs/sagemaker/en/inference --> Разделы: Создание артефакта модели для развертывания и Пользовательский код и модули.

После выполнения всех этих шагов я получаю сообщение об ошибке:

CUDA не хватает памяти. Попробовал выделить 20.00 МиБ. Всего у графического процессора 1 емкость 22,20 ГиБ, из которых 13,12 МБ свободно. Процесс 13234 имеет Используется память 2,25 ГБ. Процесс 13238 использует 3,82 ГиБ памяти. Процесс 13236 использует 8,06 ГиБ памяти. Процесс 13239 имеет 8,06 ГиБ память используется. Из выделенной памяти 6,93 ГиБ выделено PyTorch, а 49,59 МБ зарезервировано PyTorch, но не распределено. Если зарезервированная, но нераспределенная память велика, попробуйте установить max_split_size_mb во избежание фрагментации. См. документацию по управлению памятью и PYTORCH_CUDA_ALLOC_CONF: 400

Моя модель — это LLM с 7b параметрами и вычислительной мощностью ml.g5.12x (192 ГБ и 24 ГБ графического процессора x 4). Памяти более чем достаточно (поскольку я получал эту ошибку, я пробовал такие большие вычисления), и код, который я пробовал, использует AutoModelForCausalLM.from_pretrained и Autotokenizer.from_pretrained. Я пробовал карты устройств «авто», «балансированный_низкий_0» и «балансный». Памяти на графическом процессоре достаточно для начала (как я проверил из сводки памяти)

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

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

Какую модель вы пытаетесь развернуть? Протестировали ли вы свой контейнер и сценарии локально (скажем, на ec2) и подтвердили ли вы, что у вас нет никаких проблем?

Marc Karp 15.03.2024 03:31

Я только что подтвердил сценарии модели в ноутбуках Sagemaker (с графическим процессором) и развернул ее в качестве конечной точки Sagemaker: мне удалось получить пару ответов (прогнозов) от развернутой конечной точки (с графическим процессором). Третий запрос дал мне эту ошибку. Для меньшего графического процессора я получаю эту ошибку при первом запросе.

akshat garg 15.03.2024 06:12

Используемое изображение: 763104351884.dkr.ecr.us-east-1.amazonaws.com/huggingface-pyt‌​orch-inference:2.1.0‌​-transformers4.37.0-‌​gpu-py310-cu118-ubun‌​tu20.04

akshat garg 15.03.2024 06:13

W.r.t. то, что вы упомянули о локальном тестировании контейнера и сценариев с использованием EC2, не будет ли это похоже на развертывание на конечной точке? Прошу об этом, чтобы получить от вас дополнительные знания.

akshat garg 15.03.2024 06:16

Правильное локальное тестирование позволит вам устранить проблему.

Marc Karp 18.03.2024 16:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
547
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пробовал много разных вещей, упомянутых в разных местах в Интернете, но ничего мне не помогло. Ошибка возникла из-за неэффективной стратегии распределения памяти графического процессора для LLM (device_map="auto" у меня не работала) и некоторых переменных, которые сохранялись в графическом процессоре. Я упоминаю переменные, потому что в первых четырех выводах появлялась нехватка памяти (это означало, что пустой памяти, доступной на графическом процессоре, было очень мало с самого начала, и это причина, по которой я упомянул, что стратегия распределения памяти графического процессора не работала для меня) .

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

  • Обновите PYTORCH_CUDA_ALLOC_CONF max_split_size_mb. Но это может быть наименее полезным вариантом. os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:введите-размер-здесь"

  • Пользователь на другом форуме упомянул, что необходимо установить следующие пакеты: Transformers==4.28.1, Offerpiece==0.1.97, ускорение==0.18.0, bitsandbytes==0.37.2 и Torch 1.13.1. Но я считаю, что проблемы с нехваткой памяти в основном должны решаться с помощью управления памятью. Проблемы с пакетами могут быть временными в новых выпусках, но они наверняка устраняются.

  • ТОЛЬКО для обучения. При обучении моделям машинного зрения изображения могут не поместиться только в графический процессор, поэтому вам следует отрегулировать их размер, а также освободить их из памяти графического процессора.

  • ТОЛЬКО для обучения. Уменьшите размеры пакетов обучения до 1.

  • Сбор мусора gc.collect()

  • Очистить кеш torch.cuda.empty_cache()

  • Увеличение оперативной памяти системы/увеличение вычислительного экземпляра

Что мне действительно помогло, так это распределение LLM по графическим процессорам путем определения max_memory графического процессора, который можно использовать для хранения модели. Это означало, что мой графический процессор не был полностью забронирован LLM. Это трехэтапный процесс:

  • Загрузите модель без весов/пустую модель на графическом процессоре. Хотя набор выводов no_grad, чтобы избежать каких-либо обновлений веса вычислений, даже если нет веса будут обновлены. Кроме того, установите карту устройства, чтобы исправить максимальный объем памяти. загруженные модельные веса можно брать.

  • Загрузить вес модели в ЦП

  • Веса для каждого слоя загружаются в графический процессор, выполнение/расчет. выполняется, а затем веса удаляются из графического процессора.

    with torch.no_grad():
    
            with init_empty_weights():
                old_prediction_model = AutoModelForCausalLM.from_pretrained(
                    model_dir,
                    torch_dtype=torch.bfloat16,
                    quantization_config=quantization_config
                    )
            model = load_checkpoint_and_dispatch(
            old_prediction_model, offload_folder = "/offload_folder_name_or_location",
                checkpoint=model_dir, device_map=infer_auto_device_map(old_prediction_model, max_memory = {0: "10GiB"}),
                dtype=torch.bfloat16
        )

ПРИМЕЧАНИЕ. Помимо всего этого, еще одной серьезной причиной ошибок нехватки памяти является то, что ваши переменные остаются на графическом процессоре, т. е., поскольку выполнение происходит на графическом процессоре, и во время этого процесса вы пытаетесь создать список выводов или оценок модели, память графического процессора будет продолжать работать. пополняться по мере того, как будут сделаны ваши новые выводы. Чтобы избежать этого, при каждом выводе удаляйте переменные из графического процессора в память процессора.

Другие вопросы по теме