Я пытаюсь развернуть 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» и «балансный». Памяти на графическом процессоре достаточно для начала (как я проверил из сводки памяти)
Дело в том, что мне удалось получить ответ на пару пингов, а затем я начал получать эту ошибку. Я очищаю кеш в своей функции прогнозирования, но все равно получаю эту ошибку.
Как устранить ошибку нехватки памяти? Я получаю ошибку нехватки памяти либо в самом начале, либо память графического процессора постепенно заполняется с каждым выводом.
Модель: github.com/defog-ai/sqlcoder/blob/main/README.md или huggingface.co/defog/sqlcoder-7b-2/tree/main
Я только что подтвердил сценарии модели в ноутбуках Sagemaker (с графическим процессором) и развернул ее в качестве конечной точки Sagemaker: мне удалось получить пару ответов (прогнозов) от развернутой конечной точки (с графическим процессором). Третий запрос дал мне эту ошибку. Для меньшего графического процессора я получаю эту ошибку при первом запросе.
Используемое изображение: 763104351884.dkr.ecr.us-east-1.amazonaws.com/huggingface-pytorch-inference:2.1.0-transformers4.37.0-gpu-py310-cu118-ubuntu20.04
W.r.t. то, что вы упомянули о локальном тестировании контейнера и сценариев с использованием EC2, не будет ли это похоже на развертывание на конечной точке? Прошу об этом, чтобы получить от вас дополнительные знания.
Правильное локальное тестирование позволит вам устранить проблему.
Я пробовал много разных вещей, упомянутых в разных местах в Интернете, но ничего мне не помогло. Ошибка возникла из-за неэффективной стратегии распределения памяти графического процессора для 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 )
ПРИМЕЧАНИЕ. Помимо всего этого, еще одной серьезной причиной ошибок нехватки памяти является то, что ваши переменные остаются на графическом процессоре, т. е., поскольку выполнение происходит на графическом процессоре, и во время этого процесса вы пытаетесь создать список выводов или оценок модели, память графического процессора будет продолжать работать. пополняться по мере того, как будут сделаны ваши новые выводы. Чтобы избежать этого, при каждом выводе удаляйте переменные из графического процессора в память процессора.
Какую модель вы пытаетесь развернуть? Протестировали ли вы свой контейнер и сценарии локально (скажем, на ec2) и подтвердили ли вы, что у вас нет никаких проблем?