Одной из самых больших проблем при использовании LLM является стоимость доступа к ним. Многие LLM, такие как OpenAI GPT-3, доступны только через платные API. Узнайте, как развернуть любой LLM с открытым исходным кодом в качестве бесплатной конечной точки API с помощью HuggingFace и Gradio.

Модели больших языков (LLM) набирают популярность из-за их способности создавать текст, переводить с одного языка на другой и создавать различные формы творческого контента. Однако одной из самых больших проблем при использовании LLM является стоимость доступа к ним. Многие LLM, такие как OpenAI GPT-3, доступны только через платные API.

К счастью, есть умный способ использовать любой LLM бесплатно. Развернув свой собственный LLM на конечной точке API, вы можете получить к нему доступ из любой точки мира без необходимости платить какие-либо сборы. В этой статье мы покажем вам, как развернуть любой LLM с открытым исходным кодом в качестве бесплатной конечной точки API с помощью HuggingFace и Gradio.

Преимущества создания собственных конечных точек генерации текста

  • Это может сэкономить ваши деньги. Платные API могут быть дорогими, особенно если вы используете большое количество запросов. Развернув собственный LLM, вы сможете избежать этих затрат.
  • Контроль над вашими данными. Когда вы используете платный API, вы предоставляете поставщику API доступ к вашим данным. Развернув собственную конечную точку, вы можете обеспечить безопасность и безопасность своих данных.
  • Доступ к последним моделям. Развернув собственную конечную точку, вы можете выбрать LLM, который хотите использовать.
  • Возможность использовать возможности LLM на любом устройстве. Для работы LLM требуются значительные ресурсы. Конечная точка API позволяет любому устройству, подключенному к Интернету, использовать возможности LLM.

Зачем использовать Gradio и HuggingFace Spaces?

Несмотря на то, что существуют популярные поставщики облачного хостинга, такие как AWS и GCP, процесс их настройки может быть сложным, и вам часто нужно создавать собственный API Flask. Кроме того, у этих провайдеров отсутствуют бесплатные уровни, которые могут обрабатывать большие языковые модели (LLM).

Gradio — это инструмент, упрощающий создание интерактивных веб-приложений, которые можно использовать для взаимодействия с LLM. Huggingface Spaces — это бесплатная служба хостинга, которая позволяет вам развертывать приложения машинного обучения в Интернете.

С помощью функций API приложения Gradio мы можем легко получить доступ к языковой модели (LLM). Мы развертываем приложение Gradio, используя бесплатный уровень HuggingFace Spaces.

Прежде чем мы начнем развертывать LLM, давайте создадим новое пространство на HuggingFace.

Создание нового пространства на HuggingFace

«Пространство» на HuggingFace — это среда хостинга, которую можно использовать для размещения вашего приложения машинного обучения. Пространства оцениваются в зависимости от типа процессора, а самое простое бесплатно!

Создайте новое пространство:

  • Перейдите на https://huggingface.co/spaces и нажмите Создать новое пространство.
    (Вам нужно будет зарегистрировать учетную запись HuggingFace, чтобы создать пространство.)
  • Выберите лицензию MIT, если вы не уверены.
  • Выберите Gradio в качестве Space SDK.
  • Выберите Общедоступный, поскольку вы хотите, чтобы конечная точка API была доступна в любое время.

Создание приложения Gradio для доступа к LLM

В этой статье мы создадим два приложения Gradio для доступа к двум типам форматов LLM:

  • Контрольная точка LLM доступна на HuggingFace (обычная модель PyTorch)
  • Оптимизированная для процессора версия LLM (формат GGML на основе LLaMA.cpp)

Базовый формат приложения одинаков для обоих форматов:

  1. Загрузите модель.
  2. Создайте функцию, которая принимает приглашение ввода и использует модель для возврата сгенерированного текста.
  3. Создайте интерфейс Gradio для отображения сгенерированного текста и принятия пользовательского ввода.

LLM с контрольно-пропускного пункта HuggingFace:

В этом примере мы развертываем только что запущенную модель Сокол, используя ее контрольную точку HuggingFace.

Чтобы создать приложение Gradio, создайте новый файл с именем app.py и добавьте следующий код.

app.py

import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model = AutoModelForCausalLM.from_pretrained(
    "tiiuae/falcon-7b-instruct",
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
    low_cpu_mem_usage=True,
)
tokenizer = AutoTokenizer.from_pretrained("tiiuae/falcon-7b-instruct")

def generate_text(input_text):
    input_ids = tokenizer.encode(input_text, return_tensors="pt")
    attention_mask = torch.ones(input_ids.shape)
    output = model.generate(
        input_ids,
        attention_mask=attention_mask,
        max_length=200,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        eos_token_id=tokenizer.eos_token_id,
    )
    output_text = tokenizer.decode(output[0], skip_special_tokens=True)
    print(output_text)
    # Remove Prompt Echo from Generated Text
    cleaned_output_text = output_text.replace(input_text, "")
    return cleaned_output_text

text_generation_interface = gr.Interface(
    fn=generate_text,
    inputs=[
        gr.inputs.Textbox(label="Input Text"),
    ],
    outputs=gr.inputs.Textbox(label="Generated Text"),
    title="Falcon-7B Instruct",
).launch()

Этот скрипт Python использует библиотеку HuggingFace Transformers для загрузки модели tiiuae/falcon-7b-instruct. Максимальная длина генерации установлена ​​на 200 токенов, а выборка токенов top_k установлена ​​на 10. Эти параметры генерации текста могут быть установлены в соответствии с вашими требованиями. Подсказка удаляется из сгенерированного текста, поэтому модель возвращает только сгенерированный текст, а не подсказку плюс сгенерированный текст.

Файл requirements.txt создается для указания зависимостей для приложения. В файл включены следующие библиотеки:

requirements.txt

datasets
transformers
accelerate
einops
safetensors

Полный пример можно посмотреть по адресу: Falcon 7B HuggingFace Spaces.

Код для приложения можно загрузить с: Falcon 7B HuggingFace Spaces Files.

LLM из формата, оптимизированного для ЦП (GGML):

LLaMA.cpp — это библиотека C++, предоставляющая высокопроизводительный механизм логического вывода для больших языковых моделей (LLM). Он основан на библиотеке GGML (Graph Neural Network Machine Learning), которая обеспечивает быстрый и эффективный способ представления и обработки графиков. LLAMA.cpp использует GGML для эффективной загрузки и запуска LLM, что позволяет выполнять быстрый вывод на больших моделях.

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

Чтобы создать приложение Gradio, создайте новый файл с именем app.py и добавьте следующий код.

app.py

import os
import urllib.request
import gradio as gr
from llama_cpp import Llama

def download_file(file_link, filename):
    # Checks if the file already exists before downloading
    if not os.path.isfile(filename):
        urllib.request.urlretrieve(file_link, filename)
        print("File downloaded successfully.")
    else:
        print("File already exists.")

# Dowloading GGML model from HuggingFace
ggml_model_path = "https://huggingface.co/CRD716/ggml-vicuna-1.1-quantized/resolve/main/ggml-vicuna-7b-1.1-q4_1.bin"
filename = "ggml-vicuna-7b-1.1-q4_1.bin"
download_file(ggml_model_path, filename)

llm = Llama(model_path=filename, n_ctx=512, n_batch=126)

def generate_text(prompt="Who is the CEO of Apple?"):
    output = llm(
        prompt,
        max_tokens=256,
        temperature=0.1,
        top_p=0.5,
        echo=False,
        stop=["#"],
    )
    output_text = output["choices"][0]["text"].strip()
    # Remove Prompt Echo from Generated Text
    cleaned_output_text = output_text.replace(prompt, "")
    return cleaned_output_text

description = "Vicuna-7B"
examples = [
    ["What is the capital of France?", "The capital of France is Paris."],
    [
        "Who wrote the novel 'Pride and Prejudice'?",
        "The novel 'Pride and Prejudice' was written by Jane Austen.",
    ],
    ["What is the square root of 64?", "The square root of 64 is 8."],
]
gradio_interface = gr.Interface(
    fn=generate_text,
    inputs="text",
    outputs="text",
    examples=examples,
    title="Vicuna-7B",
)
gradio_interface.launch()

Приложение сначала загружает необходимый файл GGML, в данном случае Vicuna-7b-Q4.1 GGML. Код проверяет, существует ли файл, прежде чем пытаться его загрузить.

Мы используем привязки python для LLaMA.cpp для загрузки модели.

Длина контекста модели установлена ​​на 512 токенов. Максимальная поддерживаемая длина контекста для модели Vicuna составляет 2048 токенов. Модель с меньшей длиной контекста генерирует текст гораздо быстрее, чем модель с большей длиной контекста. В большинстве случаев достаточно меньшей длины контекста.

Количество токенов в подсказке и сгенерированном тексте можно проверить с помощью бесплатного Tokenizer tool by OpenAI.

Размер пакета установлен на 128 токенов. Это помогает ускорить генерацию текста на многопоточных процессорах.

Максимальная длина генерации установлена ​​на 256 токенов, температура — на 0,1, а выборка токенов — на 0,5. Также добавлен список токенов для остановки генерации. Эти параметры генерации текста могут быть установлены в соответствии с вашими требованиями.

Подробное руководство по использованию GGML-версий популярных LLM с открытым исходным кодом для быстрого логического вывода можно найти в разделе Как запустить LLM на вашем ЦП с помощью Llama.cpp: пошаговое руководство. .

Файл requirements.txt создается для указания зависимостей для приложения. В файл включены следующие библиотеки:

requirements.txt

llama-cpp-python==0.1.62

Полный пример можно посмотреть по адресу: Vicuna 7B HuggingFace Spaces.

Код для приложения можно скачать с: Vicuna 7B HuggingFace Spaces files.

Развертывание приложения Gradio на HuggingFace Spaces:

Развернуть приложение Gradio в HuggingFace Spaces так же просто, как загрузить следующие файлы в HuggingFace Space:

  • app.py — этот файл содержит код приложения.
  • requirements.txt — в этом файле перечислены зависимости для приложения.

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

Доступ к LLM в качестве конечной точки API:

В развернутом приложении Gradio уже запущена конечная точка Prediction (Inference) API в фоновом режиме.
Доступ к конечной точке можно легко получить через Gradio Python Client.

В нижней части развернутого приложения вы увидите ссылку «Использовать через API». Щелкните эту ссылку, чтобы просмотреть инструкции по вызову вашего приложения с помощью API.

Чтобы использовать API, вам необходимо установить библиотеку Gradio Client Python. Вы можете сделать это, выполнив следующую команду в своем терминале:

pip install gradio_client

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

from gradio_client import Client
# Pass the link to your HuggingFace Space here
client = Client("https://awinml-falcon-7b-instruct-api.hf.space/")
# Pass the Input Prompt to the model
result = client.predict(
    "What is the capital of USA?",
    api_name="/predict"
)
print(result)

Этот код сначала создаст объект Client и передаст ему ссылку на ваше пространство HuggingFace. Затем он передаст входное приглашение модели и вызовет метод predict(). Метод predict() вернет сгенерированный текст, который затем можно вывести на консоль.

Анализ задержки:

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

Модель Falcon-7B загружена грузами torch.bfloat16 с использованием трансформеров HuggingFace. Модель Викуна-7Б загружалась с помощью файла Q4.1 GGML с использованием Llama.cpp. Модель была загружена с длиной контекста 512 токенов вместо полных 2048 токенов.

Для обеих моделей максимальное количество токенов генерации было установлено на 256 токенов. Значения температуры, top_p и top_k были выбраны на основе статьи и не были одинаковыми для обеих моделей. Этот пост не предназначен для сравнения производительности генерации текста обеих моделей.

Для проверки задержек конечных точек использовались следующие подсказки:

  • Какая столица Греции?
  • Не могли бы вы помочь мне написать официальное электронное письмо потенциальному деловому партнеру с предложением совместного предприятия?
  • Каковы два основных различия между языками программирования Python и JavaScript?
  • Выделите пять важных ключевых слов из следующего текста: Как правительства могут использовать фискальную и денежно-кредитную политику для борьбы с экономическим спадом?

Викунья-7Б:

  • Вопрос: Столица Греции?
    Сгенерированный текст: Столица Греции — Афины.
    Затраченное время: 6,1 с.
  • Вопрос. Можете ли вы помочь мне написать официальное электронное письмо потенциальному деловому партнеру с предложением о создании совместного предприятия?
    Сгенерированный текст:
    Я пишу, чтобы выразить свою заинтересованность в создании совместное предприятие с вашей компанией. Я считаю, что наши дополняющие друг друга сильные стороны и общее видение будущего делают это идеальной возможностью для нас обоих. Наша компания имеет большой опыт работы в [укажите соответствующую отрасль или область], и мы разработали уникальную линейку продуктов, которая хорошо подходит для удовлетворения потребностей наших клиентов. Мы уверены, что опыт вашей компании в [вставьте соответствующую область] будет ценным активом для нашего партнерства, и мы верим, что вместе мы могли бы создать что-то действительно особенное. Я особенно воодушевлен потенциалом сотрудничества по [указать конкретный проект или инициативу], который, я считаю, может произвести революцию в отрасли. Наши команды уже начали обсуждение деталей этого проекта, и мы уверены, что он будет иметь огромный успех. В дополнение к нашим общим целям и взаимодополняющим преимуществам меня также впечатляет приверженность вашей компании [вставьте соответствующую социальную или экологическую проблему]. Как человек, который разделяет эти ценности, я считаю, что наше партнерство может реально изменить мир.

    Затраченное время: 126,2 с
  • Вопрос. Каковы два основных различия между языками программирования Python и JavaScript?
    Сгенерированный текст.
    Python – это язык высокого уровня общего назначения, который легко изучить и использовать. Он имеет синтаксис, похожий на английский, и поддерживает несколько типов данных, таких как целые числа, строки и списки. С другой стороны, JavaScript — это язык сценариев на стороне клиента, используемый для веб-разработки. В основном он используется для добавления интерактивных элементов на веб-сайты.
    Python является интерпретируемым языком, а JavaScript компилируется. Код Python выполняется интерпретатором, который преобразует код в машинный код, который может выполняться непосредственно процессором компьютера. Напротив, код JavaScript сначала компилируется в байт-код, а затем запускается движком JavaScript.

    Затраченное время: 72,4 с
  • Вопрос: составьте список из трех лучших фильмов Моргана Фримена. Укажите только названия фильмов.
    Сгенерированный текст:
    1. Побег из Шоушенка (1994) 2. Мисс Дейзи за рулем (1989) 3. Слава (1989)
    Затраченное время: 16,1 с

Сокол-7Б:

  • Вопрос: Столица Греции?
    Сгенерированный текст: Афины — столица Греции.
    Затраченное время: 61,2 с.
  • Вопрос. Можете ли вы помочь мне написать официальное электронное письмо потенциальному деловому партнеру с предложением совместного предприятия?
    Сгенерированный текст:
    — — — — — Генерация не зафиксирована . Слишком долго! — — — — —

    Время: 2650+
  • Вопрос. Каковы два основных различия между языками программирования Python и JavaScript?
    Сгенерированный текст:
    1. Синтаксические различия. Python — это язык более высокого уровня, и его синтаксис более структурирован по сравнению с JavaScript, который является языком более низкого уровня с менее строгими правилами синтаксиса.
    2. Использование квадратных скобок для вызовов функций. В то время как Python использует ключевое слово def для определения функций, функции JavaScript определяются с помощью квадратных скобок или литералов именованных функций.
    Затраченное время: 1524,3 с
  • Вопрос: составьте список из трех лучших фильмов Моргана Фримена. Укажите только названия фильмов.
    Сгенерированный текст: 1. Побег из Шоушенка 2. Форрест Гамп 3. Непобедимый
    Затраченное время: 371,3 с

Вердикт:

Модель Falcon-7B очень медленно генерирует текст: наименьшая задержка составляет 61 секунду, а максимальная — более 2650 секунд. Это явно не очень полезно.

Я подозреваю, что это связано с тем, что HuggingFace недавно добавил поддержку Falcon в Transformers и еще не оптимизировал реализацию модели. Это может быть связано с тем, что архитектура модели до сих пор в значительной степени неизвестна. Реализация HuggingFace также полагается на внешний код для запуска модели, что может быть узким местом. Возможно, нам повезет больше с другими, более зрелыми генеративными моделями на HuggingFace.

Модель Vicuna GGML, с другой стороны, работает очень хорошо, с задержкой от 6 до 126 секунд для самой длинной генерации.

Llama.cpp постоянно совершенствуется, и использование уменьшенной квантованной версии может еще больше сократить эту задержку. Параметры загрузки LLM также существенно влияют на производительность, поэтому их оптимизация также может привести к некоторому ускорению.

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

Исходя из этого, довольно легко рекомендовать создавать конечные точки с помощью модели Vicuna GGML и использовать ее для прототипирования приложений вместо дорогостоящего API OpenAI GPT-3.

Заключение

Теперь вы можете развернуть любую большую языковую модель (LLM) в качестве конечной точки API, написав всего несколько строк кода благодаря Gradio и HuggingFace Spaces. Эти инструменты упрощают создание собственных конечных точек генерации свободного текста. Развернув свой собственный LLM на конечной точке API, вы можете сэкономить деньги, избегая дорогостоящих платных API, и в то же время пользоваться замечательными возможностями этих мощных языковых моделей.

Ресурсы:
Код для создания конечных точек: GitHub
Llama-cpp-python: GitHub

Первоначально опубликовано на https://awinml.github.io 1 июля 2023 г.

ПИСАТЕЛЬ на MLearning.ai // Интерпретатор кода 88 использует // 800+ инструментов ИИ