Оптимизированная большая языковая модель (LLM)
Внимание
Эта функция предоставляется в режиме общедоступной предварительной версии.
Внимание
Примеры кода в этом руководстве используют устаревшие API. Databricks рекомендует использовать подготовленный интерфейс пропускной способности для оптимизированного вывода LLM. См. статью "Миграция оптимизированных конечных точек обслуживания LLM" в подготовленную пропускную способность.
В этой статье показано, как включить оптимизацию для крупных языковых моделей (LLM) в Службе модели ИИ Мозаики.
Оптимизированная служба LLM обеспечивает улучшения пропускной способности и задержки в диапазоне от 3 до 5 раз лучше по сравнению с традиционными подходами к обслуживанию. В следующей таблице перечислены поддерживаемые семейства LLM и их варианты.
Databricks рекомендует устанавливать базовые модели с помощью Databricks Marketplace. Вы можете найти семейство моделей и на странице модели выбрать Получить доступ, после чего предоставить учетные данные для установки модели в каталог Unity.
Семейство моделей | Установка из Marketplace |
---|---|
Лама 2 | Модели Llama 2 |
MPT | |
Mistral | Мистральные модели |
Требования
Оптимизированная служба LLM поддерживается в рамках общедоступной предварительной версии развертываний GPU.
Модель должна быть зарегистрирована с помощью MLflow 2.4 и выше или Databricks Runtime 13.2 ML и более поздних версий.
При развертывании моделей важно соответствовать размеру параметра модели с соответствующим размером вычислительных ресурсов. Для моделей с 50 миллиардами параметров обратитесь к группе учетных записей Azure Databricks, чтобы получить доступ к необходимым GPU.
Размер параметра модели Рекомендуемый размер вычислительных ресурсов Тип рабочей нагрузки 7 миллиардов 1xA100 GPU_LARGE
13 млрд 1xA100 GPU_LARGE
30-34 млрд 1xA100 GPU_LARGE
70 миллиардов 2xA100 GPU_LARGE_2
Журнал крупной языковой модели
Сначала зайдите в журнал модели с помощью вкуса MLflow transformers
и укажите поле задачи в метаданных MLflow.metadata = {"task": "llm/v1/completions"}
Это указывает сигнатуру API, используемую для конечной точки обслуживания модели.
Оптимизированная служба LLM совместима с типами маршрутов, поддерживаемыми шлюзом ИИ Azure Databricks; llm/v1/completions
в настоящее время. Если существует семейство моделей или тип задач, которые не поддерживаются, обратитесь к группе учетной записи Azure Databricks.
model = AutoModelForCausalLM.from_pretrained("mosaicml/mpt-7b-instruct",torch_dtype=torch.bfloat16, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained("mosaicml/mpt-7b-instruct")
with mlflow.start_run():
components = {
"model": model,
"tokenizer": tokenizer,
}
mlflow.transformers.log_model(
artifact_path="model",
transformers_model=components,
input_example=["Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\nWhat is Apache Spark?\n\n### Response:\n"],
metadata={"task": "llm/v1/completions"},
registered_model_name='mpt'
)
После сохранения модели можно зарегистрировать ваши модели в каталоге Unity следующим образом, где вы замените CATALOG.SCHEMA.MODEL_NAME
трехуровневым именем модели.
mlflow.set_registry_uri("databricks-uc")
registered_model_name=CATALOG.SCHEMA.MODEL_NAME
Создание конечной точки обслуживания модели
Затем создайте конечную точку обслуживания модели. Если ваша модель поддерживается оптимизированной службой LLM, Azure Databricks автоматически создает оптимизированную конечную точку обслуживания модели при попытке его обслуживания.
import requests
import json
# Set the name of the MLflow endpoint
endpoint_name = "llama2-3b-chat"
# Name of the registered MLflow model
model_name = "ml.llm-catalog.llama-13b"
# Get the latest version of the MLflow model
model_version = 3
# Specify the type of compute (CPU, GPU_SMALL, GPU_LARGE, etc.)
workload_type = "GPU_LARGE"
# Specify the scale-out size of compute (Small, Medium, Large, etc.)
workload_size = "Small"
# Specify Scale to Zero (only supported for CPU endpoints)
scale_to_zero = False
# Get the API endpoint and token for the current notebook context
API_ROOT = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiUrl().get()
API_TOKEN = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get()
# send the POST request to create the serving endpoint
data = {
"name": endpoint_name,
"config": {
"served_models": [
{
"model_name": model_name,
"model_version": model_version,
"workload_size": workload_size,
"scale_to_zero_enabled": scale_to_zero,
"workload_type": workload_type,
}
]
},
}
headers = {"Context-Type": "text/json", "Authorization": f"Bearer {API_TOKEN}"}
response = requests.post(
url=f"{API_ROOT}/api/2.0/serving-endpoints", json=data, headers=headers
)
print(json.dumps(response.json(), indent=4))
Формат схемы ввода и вывода
Оптимизированная конечная точка обслуживания LLM содержит входные и выходные схемы, которые управляет Azure Databricks. Поддерживаются четыре разных формата.
dataframe_split
— это кадр данных Pandas, сериализованный в формате JSON, вsplit
ориентации.{ "dataframe_split": { "columns": ["prompt"], "index": [0], "data": [ [ "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n" ] ] }, "params": { "temperature": 0.5, "max_tokens": 100, "stop": ["word1", "word2"], "candidate_count": 1 } }
dataframe_records
— это кадр данных Pandas, сериализованный в формате JSON, вrecords
ориентации.{ "dataframe_records": [ { "prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n" } ], "params": { "temperature": 0.5, "max_tokens": 100, "stop": ["word1", "word2"], "candidate_count": 1 } }
Экземпляры
{ "instances": [ { "prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n" } ], "params": { "temperature": 0.5, "max_tokens": 100, "stop": ["word1", "word2"], "candidate_count": 1 } }
входные данные
{ "inputs": { "prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instructions:\nWhat is Apache Spark?\n\n### Response:\n" }, "params": { "temperature": 0.5, "max_tokens": 100, "stop": ["word1", "word2"], "candidate_count": 1 } }
Запрос конечной точки
После готовности конечной точки его можно запросить, выполнив запрос API. В зависимости от размера и сложности модели может потребоваться 30 минут или более, чтобы конечная точка была готова.
data = {
"inputs": {
"prompt": [
"Hello, I'm a language model,"
]
},
"params": {
"max_tokens": 100,
"temperature": 0.0
}
}
headers = {"Context-Type": "text/json", "Authorization": f"Bearer {API_TOKEN}"}
response = requests.post(
url=f"{API_ROOT}/serving-endpoints/{endpoint_name}/invocations", json=data, headers=headers
)
print(json.dumps(response.json()))
Ограничения
- Учитывая повышенные требования к установке моделей, которые обслуживались на GPU, создание образа контейнера для обслуживания GPU занимает больше времени, чем создание образа для обслуживания ЦП.
- Размер модели также влияет на создание изображения. Например, для сборки моделей, имеющих 30 миллиардов параметров или более, может потребоваться по крайней мере час.
- Databricks повторно использует тот же контейнер при следующем развертывании той же версии модели, поэтому последующие развертывания будут занимать меньше времени.
- Автоматическое масштабирование для обслуживания GPU занимает больше времени, чем для обслуживания ЦП, из-за увеличения времени настройки моделей, обслуживаемых на вычислительных ресурсах GPU. Databricks рекомендует чрезмерно подготовиться, чтобы избежать времени ожидания запросов.