В этом посте показано, как развернуть модель чата Llama 2 (параметры 7B) в Vertex AI Prediction с помощью графического процессора T4. Модель будет загружена и встроена в собственное прогнозируемое изображение с использованием сервера Uvicorn. Вы будете использовать тип машины n1-standard-4 с графическим процессором 1xT4 NVidia в Vertex AI Prediction.

Также предоставляется демо-версия на основе Streamlit, развернутая в Cloud Run, позволяющая легко выполнять запросы к развернутой модели.

Модель: Лама 2

Llama 2 — это новое поколение Meta Large Language Model, выпущенное со свободной лицензией для коммерческого и образовательного использования. Примечание. Пункт 2 касается ограничения в 700 миллионов активных пользователей в месяц, для чего требуется специальная лицензия Meta.

Llama 2 — это авторегрессионная языковая модель на основе преобразователя с несколькими размерами модели. Основными особенностями этой модели являются:

  • Обучение проводилось на новом наборе общедоступных данных, всего около токенов 2T.
  • Увеличена вдвое длина контекста модели (4К) по сравнению с Llama 1 (2К).
  • Групповой запрос внимания.
  • Доступные размеры: 7B, 13B, 34B (только предварительно обученные, без чата), параметры 70B.

Модель карточки здесь и бумага здесь.

GGML — тензорная библиотека для глубокого обучения, написанная на C, без дополнительных зависимостей от других известных библиотек глубокого обучения, таких как Torch, Transformers, Accelerate. GGML требуется только CUDA/C++ для выполнения на графическом процессоре.

GGML реализует некоторые функции для обучения и оптимизации моделей LLM на обычном оборудовании.

CTransformers — это привязка Python для GGML.

В этом посте мы будем использовать веса GGML, преобразованные TheBloke и сохраненные в Hugging Face. Модель, используемая в этом примере, представляет собой 2-битную модель GGML, которая использует новый метод k-кванта в GGML.

Вам необходимо скачать модель и сохранить ее в каталоге predict/llama2-7b-chat-ggml с подобным содержимым. Обратите внимание, что нет необходимости использовать handler.py, поскольку вы не будете использовать TorchServe:

config.json
dolphin-llama2-7b.ggmlv3.q2_K.bin

Создание образа пользовательского контейнера прогнозирования

Требуется изображение пользовательского контейнера для прогнозов. Образ пользовательского контейнера в Vertex AI требует, чтобы в контейнере работал HTTP-сервер. В частности, контейнер должен прослушивать проверки работоспособности, работоспособности и запросы прогнозирования и отвечать на них.

Вы будете использовать сервер Uvicorn. Вам необходимо собрать и отправить образ контейнера в Реестр артефактов:

gcloud auth configure-docker europe-west4-docker.pkg.dev
gcloud builds submit --tag europe-west4-docker.pkg.dev/argolis-rafaelsanchez-ml-dev/ml-pipelines-repo/llama2-7b-chat-q2 --machine-type=e2-highcpu-8 --timeout="2h" --disk-size=300

Этот процесс сборки должен занять менее 20 минут при использовании e2-highcpu-8.

Разверните модель в Vertex AI Prediction.

Загрузите и разверните изображение в Vertex AI Prediction, используя предоставленный скрипт: python3 upload_custom.py.

Процесс загрузки и развертывания может занять до 45 минут. Обратите внимание на параметр deploy_request_timeout, чтобы избежать ошибки 504 Deadline Exceeded во время развертывания:

DEPLOY_IMAGE = 'europe-west4-docker.pkg.dev/argolis-rafaelsanchez-ml-dev/ml-pipelines-repo/llama2-7b-chat-q2' 
HEALTH_ROUTE = "/health"
PREDICT_ROUTE = "/predict"
SERVING_CONTAINER_PORTS = [7080]
model = aiplatform.Model.upload(
    display_name=f'llama2-7B-chat-q2',    
    description=f'llama2-7B-chat-q2 with Uvicorn and FastAPI',
    serving_container_image_uri=DEPLOY_IMAGE,
    serving_container_predict_route=PREDICT_ROUTE,
    serving_container_health_route=HEALTH_ROUTE,
    serving_container_ports=SERVING_CONTAINER_PORTS,
)
print(model.resource_name)
# Retrieve a Model on Vertex
model = aiplatform.Model(model.resource_name)
# Deploy model
endpoint = model.deploy(
    machine_type='n1-standard-4', 
    accelerator_type= "NVIDIA_TESLA_T4",
    accelerator_count = 1,
    traffic_split={"0": 100}, 
    min_replica_count=1,
    max_replica_count=1,
    traffic_percentage=100,
    deploy_request_timeout=1200,
    sync=True,
)
endpoint.wait()

Стоимость конечной точки Vertex Prediction (24x7) делится между стоимостью виртуального ЦП (измеряется в часах виртуального ЦП), стоимостью оперативной памяти (измеряется в ГБ-часах) и Стоимость графического процессора (измеряется в часах). В этом случае мы будем использовать n1-standard-4 с 1xT4 GPU в europe-west4, а ориентировочная стоимость — (0.4370 + 0.02761*4 + 0.0037*16)*24*30 = 436.78 USD per month.

Демо-интерфейс Streamlit

Теперь вы готовы прогнозировать развернутую модель. Вы можете использовать REST API или Python SDK, но в этом случае вы создадите простой демонстрационный пользовательский интерфейс с помощью Streamlit. Существует множество других подобных библиотек пользовательского интерфейса, например Gradio, но на этот раз давайте воспользуемся Streamlit.

Приложение Streamlit построено на базе Cloud Run. Вам необходимо сначала собрать докер, загрузить его в реестр Artifact, а затем развернуть в Cloud Run:

gcloud builds submit --tag europe-west4-docker.pkg.dev/argolis-rafaelsanchez-ml-dev/ml-pipelines-repo/llama2-7b-chat-streamlit 
gcloud run deploy llama2-7b-chat-streamlit --port 8501 --image europe-west4-docker.pkg.dev/argolis-rafaelsanchez-ml-dev/ml-pipelines-repo/llama2-7b-chat-streamlit --allow-unauthenticated --region=europe-west4 --platform=managed

ПРИМЕЧАНИЕ. В последних двух разделах вы создали два докера: один для размещения модели Llama 2 (пользовательский образ контейнера, который затем развертывается в Vertex AI), а другой (тот, который в этом разделе) для размещения приложения Streamlit, которое будет вызывать модель.

Приложение Streamlit теперь развернуто в Cloud Run. Вы можете протестировать предоставленные примеры или попробовать свои. Обратите внимание, что цель этого поста — не оценить производительность модели чата Llama 2–7B, а показать, как развернуть подобную модель в Vertex AI и Cloud Run. Вы можете получить лучшие результаты, используя версии с более высоким квантованием или более крупные модели, такие как Llama 2–13B.

Модельный сад

Сад моделей на Vertex AI — это единое место для поиска, обнаружения и взаимодействия с широким спектром моделей от Google и других компаний, включая модели с открытым исходным кодом.

На момент написания этой статьи Лама 2 все еще недоступна в Модельном саду. В саду моделей доступен только OpenLlama, копия Llama 1, с примерами кода для развертывания и настройки в Vertex AI.

ОБНОВЛЕНИЕ от 30 августа 2023 г.: как объявлено на мероприятии Cloud Next23, Llama 2 теперь доступна в Модельном саду.

Выводы

В этом посте показано, как развернуть последнюю модель Llama 2 в Vertex AI. Он использует прогнозирование Vertex AI с помощью одного графического процессора и предоставляет модель через приложение Streamlit.

Репозиторий со всем кодом вы можете найти по этой ссылке.

Рекомендации

[1] Исследовательская работа: Llama 2
[2] Оригинал Проверки Llama 2
[3] Средний пост: Как создать чат-бота на базе LLM с помощью Streamlit
[4] Средний пост: LlaMa 2 модели в экземпляре Colab с использованием GGML и ctransformers