• Русский
  • LLM Compressor с Alauda AI

    В этом документе описывается, как использовать интеграцию LLM Compressor с платформой Alauda AI для выполнения рабочих процессов сжатия моделей. Интеграция LLM Compressor в Alauda AI предоставляет два примера рабочих процессов:

    • Образ Workbench и data-free-compressor.ipynb, демонстрирующие, как сжать модель.
    • Образ Workbench и calibration-compressor.ipynb, демонстрирующие, как сжать модель с использованием набора данных для калибровки.
    блокнот

    Поддерживаемые рабочие процессы сжатия моделей

    На платформе Alauda AI вы можете использовать функцию Workbench для запуска LLM Compressor на моделях, хранящихся в вашем репозитории моделей. Ниже описаны типичные шаги для сжатия модели.

    Создание Workbench

    Следуйте инструкциям в Create Workbench, чтобы создать новый экземпляр Workbench. При создании Workbench обязательно выберите образ odh-workbench-jupyter-pytorch-llmcompressor-cuda-py312-ubi9, который включает необходимую среду LLM Compressor. В настоящее время сжатие моделей поддерживается только в JupyterLab.

    Если этот образ недоступен в вашей среде, обратитесь к связаной статье, чтобы узнать, как синхронизировать образ и исправить ресурс WorkspaceKind, чтобы образ стал доступен в вариантах создания Workbench.

    Создание репозитория моделей и загрузка моделей

    Подробные шаги по созданию репозитория моделей и загрузке файлов модели см. в разделе Upload Models Using Notebook. В примерах блокнотов в этом руководстве используется модель TinyLlama-1.1B-Chat-v1.0.

    data-free-compressor.ipynb
    from llmcompressor.modifiers.quantization import QuantizationModifier
    
    model_id = "./TinyLlama-1.1B-Chat-v1.0"
    recipe = QuantizationModifier(targets="Linear", scheme="W4A16", ignore=["lm_head"])
    1. Модель для сжатия. Вы можете изменить эту строку, если хотите использовать собственную модель.
    2. Этот recipe выполнит квантование всех слоев Linear, кроме слоев в lm_head, которые часто чувствительны к квантованию. Схема W4A16 сжимает веса до целых чисел 4-bit, сохраняя активации 16-bit.

    (Необязательно) Подготовка и загрузка набора данных

    NOTE

    Если вы планируете использовать data-free compressor notebook, этот шаг можно пропустить.

    Чтобы использовать calibration compressor notebook, необходимо подготовить и загрузить набор данных для калибровки. Подготовьте набор данных тем же способом, который описан в разделе Upload Models Using Notebook. В примере блокнота для калибровки используется набор данных ultrachat_200k.

    calibration-compressor.ipynb
    from datasets import load_dataset
    
    dataset_id = "./ultrachat_200k"
    
    num_calibration_samples = 512 if use_gpu else 4
    max_sequence_length = 2048 if use_gpu else 16
    
    ds = load_dataset(dataset_id, split="train_sft")
    ds = ds.shuffle(seed=42).select(range(num_calibration_samples))
    
    def preprocess(example): 
        text = tokenizer.apply_chat_template(
            example["messages"],
            tokenize=False,
        )
        return tokenizer(
            text,
            padding=False,
            max_length=max_sequence_length,
            truncation=True,
            add_special_tokens=False,
        )
    
    ds = ds.map(preprocess, remove_columns=ds.column_names)
    1. Создайте набор данных для калибровки, используя API Huggingface datasets. Вы можете изменить эту строку, если хотите использовать собственный набор данных.
    2. Укажите количество образцов. 512 образцов — хорошая отправная точка. Увеличение количества образцов может повысить точность.
    3. Загрузите набор данных.
    4. Перемешайте данные и возьмите только нужное количество образцов.
    5. Выполните предварительную обработку и токенизацию в формат, который использует модель.

    (Необязательно) Загрузка набора данных в совместимое с S3 объектное хранилище

    Если вы хотите загрузить наборы данных в совместимое с S3 объектное хранилище, вы можете выполнить следующий код в JupyterLab. Alauda AI поддерживает доступ к хранилищу, совместимому с S3, и в типичных развертываниях продукта используется объектное хранилище Ceph, поэтому можно использовать стандартный клиент boto3.

    import os
    from boto3.s3.transfer import TransferConfig
    import boto3
    
    local_folder = "./ultrachat_200k"
    bucket_name = "datasets"
    
    config = TransferConfig(
        multipart_threshold=100*1024*1024,
        max_concurrency=10,
        multipart_chunksize=100*1024*1024,
        use_threads=True
    )
    
    for root, dirs, files in os.walk(local_folder):
        for filename in files:
            local_path = os.path.join(root, filename)
            relative_path = os.path.relpath(local_path, local_folder)
            s3_key = f"ultrachat_200k/{relative_path.replace(os.sep, '/')}"
            s3.upload_file(local_path, bucket_name, s3_key, Config=config)
            print(f"Uploaded {local_path} -> {s3_key}")
    1. Вы можете изменить эту строку, если хотите использовать собственный набор данных.
    2. Настройте загрузку multipart с фрагментами по 100 MB и максимальным числом из 10 параллельных потоков.

    (Необязательно) Использование набора данных из совместимого с S3 объектного хранилища

    Если вы хотите использовать наборы данных, хранящиеся в совместимом с S3 объектном хранилище, сначала установите инструмент s3fs, а затем измените раздел загрузки набора данных в примере, как показано ниже. В средах Alauda AI такое S3-совместимое хранилище обычно использует объектное хранилище Ceph.

    pip install s3fs -i https://pypi.tuna.tsinghua.edu.cn/simple
    calibration-compressor.ipynb
    import os
    from datasets import load_dataset
    
    os.environ["AWS_ACCESS_KEY_ID"] = "@7Apples@"
    os.environ["AWS_SECRET_ACCESS_KEY"] = "07Apples@"
    
    storage_options = {
      "key": "07Apples@",
      "secret": "O7Apples@",
      "client_kwargs": {
        "endpoint_url": "https://ceph-obj.example.com"
      }
    }
    
    ds = load_dataset(
          'parquet',
          data_files='s3://datasets/ultrachat_200k/data/train_sft-*.parquet', 
          storage_options=storage_options, 
          split="train"
    )
    1. Задайте переменные среды (в качестве резервного варианта некоторые нижележащие компоненты будут использовать их).
    2. Определите конфигурацию хранилища; для вашей службы объектного хранилища, совместимого с S3, необходимо явно указать endpoint_url, например endpoint для объектного хранилища Ceph.
    3. Если набор данных разделен на части, это эквивалентно split="train_sft" в примере.

    Клонирование моделей и наборов данных в JupyterLab

    В терминале JupyterLab используйте git clone, чтобы загрузить репозиторий модели (и набор данных, если применимо) в ваше рабочее пространство. Для data-free compressor notebook набор данных не требуется.

    INFO

    Мы рекомендуем использовать командную строку Hugging Face (hf) для прямой загрузки моделей и наборов данных, если сетевой доступ это позволяет. Обычно такой подход быстрее и проще, чем ручное клонирование репозиториев.

    Если вы работаете в среде с ограниченным доступом к сети, для ускоренного доступа можно использовать зеркало Hugging Face:

    export HF_ENDPOINT=https://hf-mirror.com

    Для прямой загрузки моделей и наборов данных можно использовать командную строку hf. Например, чтобы загрузить модель TinyLlama:

    hf download TinyLlama/TinyLlama-1.1B-Chat-v1.0 --local-dir TinyLlama-1.1B-Chat-v1.0

    Для наборов данных для калибровки загрузка выполняется аналогично:

    hf download --repo-type dataset HuggingFaceH4/ultrachat_200k --local-dir ultrachat_200k

    Создание и запуск блокнотов для сжатия

    Скачайте подходящий пример блокнота для вашего сценария: calibration compressor notebook, если вы используете набор данных, или data-free compressor notebook в противном случае. Нажмите кнопку со стрелкой вверх на странице JupyterLab, чтобы загрузить скачанный файл блокнота.

    Загрузка сжатой модели в репозиторий

    После завершения сжатия загрузите сжатую модель обратно в репозиторий моделей. Подробные шаги по загрузке файлов модели в репозиторий моделей см. в разделе Upload Models Using Notebook.

    model_dir = "./" + model_id.split("/")[-1] + "-W4A16"
    model.save_pretrained(model_dir)
    tokenizer.save_pretrained(model_dir);
    1. Сохраните модель и tokenizer. Вы можете изменить эту строку, если хотите изменить имя выходных данных.

    Развертывание и использование сжатой модели для inference

    Квантованные и sparse-модели, которые вы создаете с помощью LLM Compressor, сохраняются с использованием библиотеки compressed-tensors (расширения Safetensors). Формат сжатия соответствует типу квантования или разреженности модели. Эти форматы нативно поддерживаются в vLLM, что обеспечивает быстрое inference благодаря оптимизированным kernel развертывания с использованием Alauda AI Inference Server. Чтобы завершить этот шаг, следуйте инструкциям в разделе create inference service.