{"id":14290,"url":"\/distributions\/14290\/click?bit=1&hash=bece6ae8cf715298895ba844b6416416882fe02c5d18dab2837319deacd2c478","title":"\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u0445\u043e\u0442\u044f\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0442\u044c \u0441 \u043c\u0430\u043b\u044b\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u043e\u043c","buttonText":"","imageUuid":""}

LLM: Docker для развертывания моделей Hugging Face

LLM: Docker для развертывания моделей Hugging Face

Hugging Face занимает ведущую позицию в области машинного обучения (ML). Их обширная коллекция предварительно обученных моделей и удобные интерфейсы полностью изменили нашу парадигму развертывания и пространства искусственного интеллекта и ML.

Если вам интересна интеграция моделей Hugging Face с Docker, вы можете найти подробное руководство в статье "Создание приложений машинного обучения с использованием Docker и Hugging Face".

Модель языка LLM (Large Language Model) - удивительное достижение в области генерации текста. В этой статье мы рассмотрим, как использовать модель LLM от Hugging Face с помощью Docker, открывая новые возможности для исследователей и энтузиастов обработки естественного языка (NLP).

Введение в Hugging Face и LLM

Hugging Face (HF) предоставляет комплексную платформу для обучения, настройки и развертывания моделей машинного обучения. Кроме того, LLM обеспечивает современную модель, способную выполнять такие задачи, как генерация текста, завершение предложений и классификация текстов.

Использование Docker для машинного обучения

Docker - надежная технология контейнеризации, которая упрощает упаковку, распространение и эксплуатацию программного обеспечения. Он гарантирует согласованную работу моделей ML в различных средах, путем упаковки их в контейнеры Docker. Это обеспечивает воспроизводимость, а также решает проблему "у меня это работает на моей машине". Тип форматов

Для большинства моделей Hugging Face доступны два варианта.

GPTQ (обычно 4-битный или 8-битный, только графический процессор)

GGML (обычно 4-, 5-, 8-битный гибрид ЦП/ГП)

Примеры методов квантования, используемых при квантовании модели ИИ, включают модели GGML и GPTQ. Это может означать квантование либо во время, либо после обучения. Уменьшая вес модели до более низкой точности, модели GGML и GPTQ — две хорошо известные квантованные модели — минимизируют размер модели и вычислительные потребности.

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

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

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

Трансформеры : современные предварительно обученные модели можно легко загрузить и обучить благодаря API и инструментам трансформеров. Используя предварительно обученные модели, вы можете сократить время и ресурсы, необходимые для обучения модели с нуля, а также сократить вычислительные затраты.
Странсформаторы : привязки Python для моделей трансформеров, разработанных на C/C++ с использованием библиотеки GGML.

Мы будем использовать модель Llama.

Создать токен «Hugging Face»

Чтобы создать токен доступа, который будет использоваться в будущем, перейдите в настройки профиля Hugging Face и выберите « Токен доступа» на левой боковой панели.

Сохраните значение созданного токена доступа.

Настройка среды Docker

Прежде чем исследовать сферу LLM, мы должны сначала настроить среду Docker.

Сначала установите Docker, следуя инструкциям на официальном сайте Docker в зависимости от вашей операционной системы.

После установки выполните следующую команду, чтобы подтвердить настройку: docker --version

Быстрая демонстрация

Следующая команда запускает контейнер с harsh-manvar-llama-2-7b-chat-test: Hugging Face и предоставляет порт 7860 из контейнера хост-компьютеру.

Он также установит HUGGING_FACE_HUB_TOKEN для переменной среды указанное вами значение.

docker run -it -p 7860:7860 --platform=linux/amd64 \ -e HUGGING_FACE_HUB_TOKEN="YOUR_VALUE_HERE" \ registry.hf.space/harsh-manvar-llama-2-7b-chat-test:latest python app.py

Флаг -it сообщает Docker запустить контейнер в интерактивном режиме и подключить к нему терминал.

Это позволит вам взаимодействовать с контейнером и его процессами.

Флаг -p сообщает Docker предоставить порт 7860 из контейнера на хост-компьютер. Это означает, что вы сможете получить доступ к веб-серверу контейнера с хост-компьютера через порт 7860

Флаг --platform=linux/amd64 сообщает Docker запустить контейнер на машине Linux с архитектурой AMD64.

Флаг -e HUGGING_FACE_HUB_TOKEN="YOUR_VALUE_HERE" сообщает Docker установить для переменной среды HUGGING_FACE_HUB_TOKEN указанное вами значение. Это необходимо для доступа к моделям Hugging Face из контейнера.

Сценарий app.py

это сценарий Python, который вы хотите запустить в контейнере. Это запустит контейнер и откроет для него терминал. Затем вы можете взаимодействовать с контейнером и его процессами в терминале. Чтобы выйти из контейнера, нажмите Ctrl+C .

Доступ к целевой странице

Чтобы получить доступ к веб-серверу контейнера, откройте веб-браузер и перейдите по адресу http://localhost:7860. Вы должны увидеть целевую страницу вашей модели Hugging Face

Откройте браузер и перейдите по адресу http://localhost:7860

Снимок экрана целевой страницы местной Docker LLM с приветственным сообщением: «Привет, приятно познакомиться. Я могу вам чем-то помочь или вы хотели бы пообщаться?»

Доступ к локальному Docker LLM. Клонирование проекта

Для начала вы можете клонировать или загрузить существующее пространство/репозиторий Hugging Face .

git clone https://huggingface.co/spaces/harsh-manvar/llama-2-7b-chat-test

Файл: require.txt

Файл requirements.txt— это текстовый файл, в котором перечислены пакеты и модули Python, необходимые для запуска проекта. Он используется для управления зависимостями проекта и для обеспечения того, чтобы все разработчики, работающие над проектом, использовали одни и те же версии необходимых пакетов.

Следующие пакеты Python необходимы для запуска llama-2-13b-chat модели Hugging Face.

Обратите внимание, что эта модель имеет большой размер, поэтому загрузка и установка может занять некоторое время. Вам также может потребоваться увеличить память, выделенную вашему процессу Python для запуска модели. gradio==3.37.0

protobuf==3.20.3

scipy==1.11.1

torch==2.0.1

sentencepiece==0.1.99

transformers==4.31.0

ctransformers==0.2.27

Файл: Dockerfile FROM python:3.9 RUN useradd -m -u 1000 user WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --upgrade pip RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt USER user COPY --link --chown=1000 ./ /code

В следующем разделе представлена разбивка Dockerfile. Первая строка сообщает Docker использовать официальный образ Python 3.9 в качестве базового образа для нашего образа: FROM python:3.9

Следующая строка создает нового пользователя с именем user и идентификатором пользователя 1000. -m Флаг указывает Docker создать домашний каталог для пользователя.

RUN useradd -m -u 1000 user

Далее эта строка устанавливает рабочий каталог для контейнера

/code: . WORKDIR /code

Пришло время скопировать файл требований из текущего каталога в /code контейнер. Кроме того, эта строка обновляет менеджер пакетов pip в контейнере.

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

Эта строка устанавливает пользователя по умолчанию для контейнера user. USER user

Следующая строка копирует содержимое текущего каталога в /code контейнер.

Флаг --link указывает Docker создавать жесткие ссылки вместо копирования файлов, что может повысить производительность и уменьшить размер образа.

Флаг --chown=1000 сообщает Docker о необходимости изменить право собственности на скопированные файлы на пользователя пользователя.

COPY --link --chown=1000 ./ /code

После создания образа Docker вы можете запустить его с помощью docker run команды. Это запустит новый контейнер, в котором будет запущен образ Python 3.9 от пользователя без полномочий root. Затем вы можете взаимодействовать с контейнером с помощью терминала.

Файл: app.py

Код Python показывает, как использовать Gradio для создания демонстрации модели генерации текста, обученной с помощью преобразователей. Код позволяет пользователям вводить текстовое приглашение и генерировать продолжение текста.

Gradio — это библиотека Python, которая позволяет вам легко создавать и публиковать интерактивные демонстрации машинного обучения. Он предоставляет простой и интуитивно понятный интерфейс для создания и развертывания демонстраций, а также поддерживает широкий спектр платформ и библиотек машинного обучения, включая преобразователи.

Этот скрипт Python представляет собой демо-версию Gradio для текстового чат-бота. Он использует предварительно обученную модель генерации текста для генерации ответов на ввод пользователя. Мы разберем файл и посмотрим на каждый из разделов.

Следующая строка импортирует Iterator тип из typing модуля. Этот тип используется для представления последовательности значений, которые можно перебирать.

Следующая строка gradio также импортирует библиотеку.

from typing import Iterator import gradio as gr

Следующая строка импортирует logging модуль из transformers библиотеки, которая является популярной библиотекой машинного обучения для обработки естественного языка.

from transformers.utils import logging from model import get_input_token_length, run

Далее эта строка импортирует функции get_input_token_length() и run() из модуля модели. Эти функции используются для расчета длины входного токена текста и генерации текста с использованием предварительно обученной модели генерации текста соответственно.

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

from model import get_input_token_length, run logging.set_verbosity_info() logger = logging.get_logger("transformers")

Следующие строки определяют некоторые константы, которые используются во всем коде. Кроме того, линии определяют текст, отображаемый в демо-версии Gradio.

DEFAULT_SYSTEM_PROMPT = """""" MAX_MAX_NEW_TOKENS = 2048 DEFAULT_MAX_NEW_TOKENS = 1024 MAX_INPUT_TOKEN_LENGTH = 4000 DESCRIPTION = """""" LICENSE = """"""

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

logger.info("Starting") def clear_and_save_textbox(message: str) -> tuple[str, str]: return '', message

Следующая функция отображает входящее сообщение в чат-боте и добавляет сообщение в историю чата.

def display_input(message: str, history: list[tuple[str, str]]) -> list[tuple[str, str]]: history.append((message, '')) logger.info("display_input=%s",message) return history

Эта функция удаляет предыдущий ответ из истории чата и возвращает обновленную историю чата и предыдущий ответ.

def delete_prev_fn( history: list[tuple[str, str]]) -> tuple[list[tuple[str, str]], str]: try: message, _ = history.pop() except IndexError: message = '' return history, message or ''
def delete_prev_fn( history: list[tuple[str, str]]) -> tuple[list[tuple[str, str]], str]: try: message, _ = history.pop() except IndexError: message = '' return history, message or ''

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

Следующая функция генерирует ответ на данное сообщение и возвращает пустую строку и сгенерированный ответ.

def process_example(message: str) -> tuple[str, list[tuple[str, str]]]: generator = generate(message, [], DEFAULT_SYSTEM_PROMPT, 1024, 1, 0.95, 50) for x in generator: pass return '', x

Вот полный код Python :

Функции check_input_token_length и generate составляют основную часть кода. Функция generate отвечает за генерацию ответа на основе сообщения, истории предыдущих сообщений и различных параметров генерации, в том числе:

max_new_tokens: это целое число, указывающее наибольшее количество токенов, которые разрешено создавать модели генерации ответов.

temperature: это значение с плавающей запятой регулирует, насколько случайным является выводимый результат.

Результат более случайный при более высоких значениях (например, 1,0) и более предсказуемый при более низких уровнях (например, 0,2).

top_p: Выборка ядра определяется этим плавающим значением, которое находится в диапазоне от 0 до 1. Оно устанавливает точку отсечения для кумулятивной вероятности токенов.

top_k: количество следующих токенов, которые будут учитываться, представлено этим целым числом. Большее число приводит к более концентрированному результату.

Компонент пользовательского интерфейса и запуск сервера API обрабатываются app.py.

По сути, app.py здесь вы инициализируете приложение и другую конфигурацию.

File: Model.py

Скрипт Python — это чат-бот, который использует LLM для генерации ответов на вводимые пользователем данные. Сценарий использует следующие шаги для генерации ответа:

Он создает приглашение для LLM путем объединения вводимых пользователем данных, истории чата и системного приглашения. Он вычисляет длину входного токена приглашения.

Он генерирует ответ, используя LLM и следующие параметры:

max_new_tokens: Максимальное количество новых токенов для генерации. температура: температура, используемая при генерации ответа. Более высокая температура приведет к более творческим и разнообразным реакциям, но может также привести к менее последовательным реакциям.

top_p: этот параметр управляет алгоритмом выборки ядра, используемым для генерации ответа. Более высокое значение top_p приведет к более целенаправленным и информативным ответам, а более низкое значение приведет к более творческим и разнообразным ответам.

top_k: этот параметр управляет количеством токенов с наибольшей вероятностью, которые следует учитывать при генерации ответа.

Более высокое значение top_k приведет к более предсказуемым и последовательным ответам, а более низкое значение приведет к более творческим и разнообразным ответам.

Основная функция класса TextIteratorStreamer — сохранение в очереди готового к печати текста. Эта очередь затем может использоваться последующим приложением в качестве итератора для доступа к сгенерированному тексту неблокирующим способом.

from threading import Thread from typing import Iterator #import torch from transformers.utils import logging from ctransformers import AutoModelForCausalLM from transformers import TextIteratorStreamer, AutoTokenizer logging.set_verbosity_info() logger = logging.get_logger("transformers") config = {"max_new_tokens": 256, "repetition_penalty": 1.1, "temperature": 0.1, "stream": True} model_id = "TheBloke/Llama-2-7B-Chat-GGML" device = "cpu" model = AutoModelForCausalLM.from_pretrained(model_id, model_type="llama", lib="avx2", hf=True) tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf") def get_prompt(message: str, chat_history: list[tuple[str, str]], system_prompt: str) -> str: #logger.info("get_prompt chat_history=%s",chat_history) #logger.info("get_prompt system_prompt=%s",system_prompt) texts = [f'[INST] <>\n{system_prompt}\n<>\n\n'] #logger.info("texts=%s",texts) do_strip = False for user_input, response in chat_history: user_input = user_input.strip() if do_strip else user_input do_strip = True texts.append(f'{user_input} [/INST] {response.strip()} [INST] ') message = message.strip() if do_strip else message #logger.info("get_prompt message=%s",message) texts.append(f'{message} [/INST]') #logger.info("get_prompt final texts=%s",texts) return ''.join(texts) def get_input_token_length(message: str, chat_history: list[tuple[str, str]], system_prompt: str) -> int: #logger.info("get_input_token_length=%s",message) prompt = get_prompt(message, chat_history, system_prompt) #logger.info("prompt=%s",prompt) input_ids = tokenizer([prompt], return_tensors='np', add_special_tokens=False)['input_ids'] #logger.info("input_ids=%s",input_ids) return input_ids.shape[-1] def run(message: str, chat_history: list[tuple[str, str]], system_prompt: str, max_new_tokens: int = 1024, temperature: float = 0.8, top_p: float = 0.95, top_k: int = 50) -> Iterator[str]: prompt = get_prompt(message, chat_history, system_prompt) inputs = tokenizer([prompt], return_tensors='pt', add_special_tokens=False).to(device) streamer = TextIteratorStreamer(tokenizer, timeout=15., skip_prompt=True, skip_special_tokens=True) generate_kwargs = dict( inputs, streamer=streamer, max_new_tokens=max_new_tokens, do_sample=True, top_p=top_p, top_k=top_k, temperature=temperature, num_beams=1, ) t = Thread(target=model.generate, kwargs=generate_kwargs) t.start() outputs = [] for text in streamer: outputs.append(text) yield "".join(outputs)

Чтобы импортировать необходимые модули и библиотеки для генерации текста с помощью преобразователей, мы можем использовать следующий код:

из трансформеров импортировать AutoTokenizer, AutoModelForCausalLM

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

Чтобы определить модель для импорта, мы можем использовать: model_id = "TheBloke/Llama-2-7B-Chat-GGML"

На этом этапе идентификатор модели определяется как TheBloke/Llama-2-7B-Chat-GGML, уменьшенная версия модели чата LLama Meta 7B.

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

tokenizer = AutoTokenizer.from_pretrained(model_id) модель = AutoModelForCausalLM.from_pretrained(model_id)

Это загрузит токенизатор и модель из Hugging Face Hub.

Задача токенизатора — подготовить входные данные модели. Токенайзеры для каждой модели доступны в библиотеке. Определите модель для импорта; опять же, мы используем TheBloke/Llama-2-7B-Chat-GGML.

Вам необходимо установить переменные и значения в конфигурации для max_new_tokens, температуры, повторения_пенальти и потока:

max_new_tokens: возможно большинство токенов, независимо от количества токенов, указанного в подсказке. температура: сумма, которая была использована для изменения вероятности последующих токенов. repetition_penalty: параметр штрафа за повторение. 1,0 означает отсутствие наказания. поток: следует ли генерировать текст ответа в потоковом режиме или в одном пакете.

Вы также можете создать пространство и зафиксировать в нем файлы для размещения приложений на Hugging Face и непосредственного тестирования.

Создание образа

Следующая команда создает образ Docker для llama-2-13b-chatмодели на linux/amd64платформе. Изображение будет помечено именем local-llm:v1. docker buildx build --platform=linux/amd64 -t local-llm:v1 . Запуск контейнера

Следующая команда запустит новый контейнер с local-llm:v1изображением Docker и предоставит порт 7860на хост-компьютере. Переменная среды -e HUGGING_FACE_HUB_TOKEN="YOUR_VALUE_HERE"устанавливает токен Hugging Face Hub, который необходим для загрузки llama-2-13b-chatмодели из Hugging Face Hub. docker run -it -p 7860:7860 --platform=linux/amd64 -e HUGGING_FACE_HUB_TOKEN="YOUR_VALUE_HERE" local-llm:v1 python app.py

Затем откройте браузер и перейдите по адресу http://localhost:7860, чтобы увидеть выходные данные локального контейнера LLM Docker.

Снимок экрана вывода контейнера докера llm, на котором чат-бот говорит: «Привет! Я всего лишь искусственный интеллект, поэтому у меня нет чувств или эмоций, как у человека. Однако я здесь, чтобы помочь…» Рисунок 3.

Вывод локального контейнера LLM Docker.

Вы также можете просматривать контейнеры через Docker Desktop Мониторинг контейнеров с помощью Docker Desktop. Заключение

Локальное развертывание модели LLM GGML с помощью Docker — это удобный и эффективный способ использования обработки естественного языка. Докеризация модели позволяет легко перемещать ее между различными средами и гарантирует согласованность ее работы. Тестирование модели в браузере обеспечивает удобный интерфейс и позволяет быстро оценить ее работоспособность.

Эта настройка дает вам больше контроля над вашей инфраструктурой и данными, а также упрощает развертывание расширенных языковых моделей для различных приложений. Это значительный шаг вперед в развертывании больших языковых моделей. © 2024 NemtyrevAI

0
Комментарии
-3 комментариев
Раскрывать всегда