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

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

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

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

    На платформе 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. Этот рецепт выполнит квантизацию всех слоёв Linear, кроме тех, что в lm_head, который часто чувствителен к квантизации. Схема W4A16 сжимает веса до 4-битных целых чисел, сохраняя 16-битные активации.

    (Опционально) Подготовка и загрузка набора данных

    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.

    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 МБ и максимум 10 параллельных потоков.

    (Опционально) Использование набора данных из хранилища S3

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

    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": "http://minio.minio-system.svc.cluster.local:80"
      }
    }
    
    ds = load_dataset(
          'parquet',
          data_files='s3://datasets/ultrachat_200k/data/train_sft-*.parquet', 
          storage_options=storage_options, 
          split="train"
    )
    1. Установите переменные окружения (в качестве резервного варианта, некоторые внутренние компоненты будут их использовать).
    2. Определите конфигурацию хранилища; необходимо явно указать endpoint_url для подключения к MinIO.
    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. Сохраните модель и токенизатор. Вы можете изменить эту строку, если хотите изменить имя выходного файла.

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

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