В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные персональные помощники, основные продукты и даже дополнительные услуги. AWS, сокращение от Amazon Web Services, предлагает множество вариантов размещения и развертывания этих LLM. Это может быть так же просто, как развертывание с помощью одной команды с помощью SageMaker JumpStart, или немного сложнее, используя Elastic Compute Service и Application Load Balancer.

В этой записи блога я постараюсь помочь вам быстро и эффективно развернуть эти более сложные конфигурации с помощью мощного инструмента от AWS, известного как AWS Copilot. По сути, это интерфейс командной строки, разработанный специально для контейнеров, что упрощает развертывание контейнерных приложений и управление ими.

Смотрите мой полный доклад на эту тему с демонстрацией на LinkedIn или Youtube.

Код демо доступен на github.

Важные части логического вывода

При принятии решения о выводе LLM необходимо учитывать несколько параметров:

  • Модель
  • Код
  • Контейнер
  • оркестровка
  • Аппаратное обеспечение

Модель

Выбор модели является сложной задачей, поскольку существует множество LLM, доступных для использования. HuggingFace поддерживает Открытую панель инструментов LLM с наиболее эффективными моделями, а LLM Arena от LMSYS.ORG — это способ увидеть ответы на одно и то же приглашение от разных моделей.

Еще одна вещь, которую нужно решить, — какие оптимизации использовать. Это руководство Сергея Саввова описывает различные оптимизации для LLM и то, как они работают.

Для своей демонстрации я буду использовать очищенный LLM от LaMini-LM (GitHub, huggingface, paper). Эти модели были взяты из популярных LLM, таких как T5, и обучены на крупномасштабном наборе данных из 2,58 млн инструкций.

Код и контейнер

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

В своей демонстрации я буду использовать фреймворк TGI от HuggingFace, так как он лучше всего поддерживает разные модели и не требует преобразования моделей.

Оркестрация и сетевое взаимодействие

Здесь важно решить, как будут развернуты кластер, контейнер и балансировщик нагрузки. Существует несколько способов развертывания контейнерных приложений для инференса — SageMaker Endpoint, который прост в развертывании и управлении, ECS+ASG+ALB, который обеспечивает максимальную гибкость, и AWS Lambda, который будет наиболее масштабируемым решением.

Для моей демонстрации я буду использовать опцию ECS+ALB+Fargate. Обычно такое решение сложно развернуть, но с помощью AWS Copilot развертывание веб-сервера такого типа и управление им чрезвычайно просто. Ознакомьтесь с моей предыдущей записью в блоге, в которой более подробно рассказывается о Fargate и AWS Copilot. Следует помнить одну вещь: у Fargate есть только варианты ЦП, поэтому, хотя мы не ограничены памятью (максимум 120 ГБ), нам все равно нужно выбирать LLM, оптимизированные для ЦП.

Пошаговое развертывание

1. Клонируйте репозиторий

Сначала клонируйте репозиторий GitHub на свой локальный компьютер:

git clone https://github.com/ryfeus/aws-inference-benchmark.git
cd copilot/transformers/aws-copilot-inference-service

Этот репозиторий содержит весь необходимый код для развертывания модели глубокого обучения для вывода LLM.

2. Клонируем модель из HuggingFace

Далее нам нужно клонировать репозиторий HuggingFace с моделью. Для этого примера я выбрал LaMini-T5, но можно использовать и другие модели. Однако имейте в виду ограничение процессора.

git lfs install
git clone https://huggingface.co/MBZUAI/LaMini-T5-223M.git
mv LaMini-T5-223M model

3. Код в репо

Основные файлы в репозитории кода: app.py с бизнес-логикой, Dockerfile с реализацией образа Docker и manifest.yml, который используется для настройки облачной инфраструктуры.

app.py — содержит код для вывода преобразователей, проверки работоспособности и управления веб-запросами.

from aiohttp import web
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
import torch
import json

checkpoint = "./model/"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
base_model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint,device_map='auto',torch_dtype=torch.float32)
pipe = pipeline('text2text-generation',model=base_model, tokenizer=tokenizer, max_length=512, do_sample=True,
                temperature=0.3, top_p=0.95)

routes = web.RouteTableDef()


@routes.get('/')
async def healthcheck(request):
    return web.Response()


@routes.post('/predict')
async def predict(request):
    try:
        req = await request.json()
        instruction = req.get('instruction', 'What is the capital of Spain?')
        generated_text = pipe(instruction)
        response = ''
        for text in generated_text:
            response += text['generated_text']
        resp = {
            'result': response
        }
        return web.Response(text=json.dumps(resp))
    except Exception as e:
        return web.Response(text=str(e), status=500)


def create_app():
    app = web.Application()
    app.add_routes(routes)
    return app


async def create_gunicorn_app():
    return create_app()


if __name__ == '__main__':
    web.run_app(create_app(), port=8080)

Dockerfile — используется для создания образа Docker, который будет работать на кластере ECS.

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8080
CMD [ "python", "./app.py" ]

Манифест Copilot — файл конфигурации, который определяет различные параметры кластера, такие как распределение ЦП/памяти, количество ВМ и доступные пути.

name: demo
type: Load Balanced Web Service

http:
  path: '/'
  healthcheck: '/'

# Configuration for your containers and service.
image:
  # Docker build arguments. For additional overrides: https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/#image-build
  build: copilot/aws-copilot-sample-service/Dockerfile
  # Port exposed through your container to route traffic to it.
  port: 8080

cpu: 1024       # Number of CPU units for the task.
memory: 2048    # Amount of memory in MiB used by the task.
platform: linux/x86_64  # See https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/#platform
count: 1       # Number of tasks that should be running in your service.
exec: true     # Enable running commands in your container.
network:
  connect: true # Enable Service Connect for intra-environment traffic between services.

4. Инициализируйте среду и разверните приложение

Затем инициализируйте среду AWS Copilot:

copilot env init

Эта команда устанавливает среду, в которой будет находиться ваш сервис.

Теперь вы можете развернуть приложение, используя:

copilot deploy

Эта команда позаботится о создании образа Docker, его отправке в Amazon ECR и развертывании в Amazon ECS/Fargate.

5. Протестируйте конечную точку

После успешного развертывания вы можете сделать один прогноз, отправив запрос POST в свой сервис. Замените <prefix> на префикс вашей конечной точки:

curl -X POST -H "Content-Type: application/json" -d '{"instruction":"What are the main tour attractions in Rome?"}' http://<prefix>.us-east-1.elb.amazonaws.com/predict

Ответ должен быть:

{"result": "1. Colosseum 2. Pantheon 3. Roman Forum 4. Trevi Fountain 5. Vatican City 6. Roman Forum 7. Roman Forum 8. Roman Forum 9. Castel Sant'Angelo 10. Roman Forum"}

Заключение

В этой записи блога мы показали, как развернуть конечную точку логического вывода LLM с помощью AWS Copilot на AWS Fargate с платформой TGI. AWS Copilot упрощает процесс развертывания ваших сервисов, а AWS Fargate обеспечивает их бесперебойную работу в бессерверной среде. Этот стек является одновременно гибким и простым в управлении, поэтому мы надеемся, что это руководство поможет вам в развертывании масштабируемых и надежных LLM в облаке.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord. Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.