Обслуживание большой языковой модели и чат-бот

В предыдущей статье мы развернули пользовательский интерфейс Huggingface Chat с моделями Huggingface. Что делать, если модели, которую вы хотите развернуть, нет в Huggingface, например локально настроенную модель или вы хотите применить собственную логику к входным и выходным данным модели. К счастью, пользовательский интерфейс Chat поддерживает модели, обслуживаемые с использованием вывода генерации текста Huggingface или даже после использования специального API.

Вывод генерации текста

Вывод при генерации текста: сервер Rust, Python и gRPC для вывода при генерации текста. Используется в HuggingFace для поддержки Hugging Chat, Inference API и Inference Endpoint. Он может обслуживать модель на Huggingface или модель, хранящуюся по локальному пути. Другие функции (самые важные: квантование, потоковая передача токенов), поддерживаемые модели.

Модель на Huggingface

Ниже приведен скрипт для обслуживания модели «tiiuae/falcon-7b-instruct». Вам необходимо указать путь к тому модели для хранения локально загруженных весов (который также можно использовать для обслуживания локальной модели).

model=tiiuae/falcon-7b-instruct
volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run

docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:1.0.3 --model-id $model

Клиент

curl 127.0.0.1:8080/generate \
    -X POST \
    -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":20}}' \
    -H 'Content-Type: application/json'

Локальная модель

Ниже приведен сценарий для обслуживания локальной модели. Мы копируем загруженную модель llama-2–13b-chat в локальную папку, затем сопоставляем локальную папку ~/serving/text-generation-inference/data с /data в контейнере. , то из контейнера вы сможете получить доступ к модели через папку /data/models/Llama-2–13b-chat-hf. Таким образом, вы также можете использовать локально настроенную модель (вам необходимо предоставить полную модель, она не поддерживает адаптер LORA изначально, поэтому вам необходимо сначала объединить модель)

mkdir -p ~/serving/text-generation-inference/data/models/Llama-2-13b-chat-hf
cp -rL  ~/.cache/huggingface/hub/models--meta-llama--Llama-2-13b-chat-hf/snapshots/<snapshot id>/*.* ~/serving/text-generation-inference/data/models/Llama-2-13b-chat-hf
cd ~/serving/text-generation-inference
# model=meta-llama/Llama-2-13b-chat-hf
model=/data/models/Llama-2-13b-chat-hf
volume=~/serving/text-generation-inference/data # share a volume with the Docker container to avoid downloading weights every run
# token=

docker run --gpus all --shm-size 1g --rm -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:1.0.3 --model-id $model --quantize bitsandbytes-nf4 --trust-remote-code

Защита вывода генерации текста с помощью обратного прокси

Вывод генерации текста не обеспечивает аутентификацию по умолчанию. Однако вы можете использовать обратный прокси-сервер, чтобы защитить его, добавив базовую аутентификацию, аутентификацию oauth. Известный обратный прокси-сервер — nginx.

Базовая аутентификация

Идея заключается в том, что вывод о генерации текста может быть скрыт за параметром безопасности, к которому внешние пользователи не могут получить прямой доступ (например, порт или IP-адрес, недоступный напрямую). Затем используйте nginx для пересылки запроса на вывод генерации текста.

Вывод генерации текста в защищенном порту (например, 9080)

model=tiiuae/falcon-7b-instruct
volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run

docker run --gpus all --shm-size 1g -p 9080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:1.0.3 --model-id $model

Установите nginx и создайте пользователя

sudo apt update -y && sudo apt install nginx -y
sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.htpasswd <username>

Создать правило переадресации (открывая порт 8080 и пересылая его на порт 9080).

sudo vi /etc/nginx/conf.d/mycontainer.conf
server {
    listen 8080;
    server_name <server name>;
 
    location / {
        proxy_pass http://localhost:9080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
 
        # Basic authentication with username and password
        auth_basic "Restricted Access";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

Клиент

curl <ip>:8080/generate \
    -X POST \
    -u <username>:<password> \
    -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":20}}' \
    -H 'Content-Type: application/json'

Приложение

OAuth-прокси Nginx