- PVSM.RU - https://www.pvsm.ru -

OLMo: (Миниатюрная) Открытая Языковая Модель

OLMo: (Миниатюрная) Открытая Языковая Модель - 1

OLMo — моделька от AI2, разработанная учёными для учёных. Если вы занимаетесь экспериментами над нейронками, это идеальный вариант: весь код и данные, необходимые для тренировки, открыто лежат на GitHub [1]. Более того, выложены даже промежуточные чекпоинты, с очень высокой гранулярностью. Это отличает ее от якобы "открытых" нейронок, которые обычно приходят к тебе монолитным финальным бинарём.

Эта статья — короткий гайд, по большей части взятый с GitHub создателей нейросети. Гайд проверен в боевых условиях и действительно работает.

Установка

Сначала установливаем Git, Python и PyTorch [2], следуя инструкциям для вашей операционной системы. Инструкции для PyTorch есть здесь [3].

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

git clone https://github.com/allenai/OLMo.git
cd OLMo
pip install -e .[all]

Также можно установить из PyPI:

pip install ai2-olmo

Shameless plug. Хотите свежего мяса и пейперов про нейронки? Телега @1red2black [4].

Предварительное обучение

Предварительное обучение OLMo проходит в два этапа. На первом этапе мы обучаем модель на больших объёмах данных, преимущественно из интернета: OLMo-mix-1124 [5] На втором этапе мы обучаем на меньшем объёме высококачественных целевых данных: Dolmino-mix-1124 [6]

Вы можете найти все контрольные точки моделей, как минимум каждые 1000 шагов обучения, в форматах OLMo и Hugging Face:

Вариант

Формат OLMo (Этап 1)

Формат OLMo (Этап 2)

Формат Hugging Face

OLMo-2 1B

OLMo-2 1B [7]

OLMo-2 1B [8]

Hugging Face для варианта 1B [9]

OLMo-2 7B

OLMo-2 7B [10]

OLMo-2 7B [11]

Hugging Face для варианта 7B [12]

OLMo-2 13B

OLMo-2 13B [13]

OLMo-2 13B [14]

Hugging Face для варианта 13B [15]

OLMo-2 32B

OLMo-2 32B [16]

OLMo-2 32B [17]

Hugging Face для варианта 32B [18]

Примечание: для варианта 32B использовались новые скрипты для тренинга, которые тоже открыто опубликованы. Если хотите пройти весь этот путь, для обучения или дообучения OLMo-2 32B посетите OLMo-core [19].

Шаги для воспроизведения

Чтобы воспроизвести любой из описанных ниже процессов обучения, выполните:

torchrun --nproc_per_node=8 scripts/train.py {путь_к_файлу_конфигурации}

Параметр --nproc_per_node , как и следует из названия — количество одновременных процессов PyTorch. Если у вас несколько GPU, то стоит установить значение, равное количеству GPU. При тренинге целиком на CPU, там должно быть разумное количество ядер процессора (не стоит на 16-ядерном процессоре занимать все 16 ядер).

Для настройки обучения, используйте любую из конфигураций, перечисленных ниже.

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

torchrun --nproc_per_node=8 scripts/train.py {путь_к_файлу_конфигурации} 
  --настройка=значение 
  --настройка=значение 
  --настройка.поднастройка=значение

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

Для запуска на устройствах Mac с процессорами Apple:

python scripts/train.py {путь_к_файлу_конфигурации}

Пример:

python scripts/train.py configs/tiny/OLMo-20M.yaml --save_overwrite

Примечание: Для запуска необходимо обновить PyTorch до версии 2.5.x.

Этап 1

Этап 1 — самый масштабный и дорогой этап, где нейронка обучается на 4-5 триллионах токенов. В таблице ниже приведены ссылки на файлы, которые нужно передавать для консольной команды pytorch:

OLMo2 1B

OLMo2 7B

OLMo2 13B

Number of tokens

4 Trillion

4 Trillion

5 Trillion

Checkpoint

stage1-step1907359-tokens4001B [20]

stage1-step928646-tokens3896B [21]

stage1-step596057-tokens5001B [22]

Training config

OLMo2-1B-stage1.yaml [23]

OLMo2-7B-stage1.yaml [24]

OLMo2-13B-stage1.yaml [25]

WandB

wandb.ai/OLMo2-1B [26]

wandb.ai/OLMo2-7B [27]

wandb.ai/OLMo2-13B [28]

Данные, в основном, загружаются из веба. Посмотрите, как выглядит раздел data.paths, и не забудьте пересохранить его в виде локальных файлов. В качестве лайфхака, можно локально развернуть веб-сервер и подменить домен olmo-data.org на 127.0.0.1. В общем, развлекайтесь, оптимизация — дело добровольное.

data:
  pad_direction: right
  # generate_doc_lengths: true
  num_workers: 32
  drop_last: true
  pin_memory: true
  prefetch_factor: 8
  persistent_workers: true
  memmap_dtype: uint32
  timeout: 0
  instance_filter:
    repetition_max_period: 13
    repetition_min_period: 1
    repetition_max_count: 32
  paths:
    # ProofPile 2: Algebraic Stack Data
    - http://olmo-data.org/preprocessed/proof-pile-2/v0_decontaminated/algebraic-stack/train/allenai/dolma2-tokenizer/part-00-00000.npy
    - http://olmo-data.org/preprocessed/proof-pile-2/v0_decontaminated/algebraic-stack/train/allenai/dolma2-tokenizer/part-01-00000.npy
    - http://olmo-data.org/preprocessed/proof-pile-2/v0_decontaminated/algebraic-stack/train/allenai/dolma2-tokenizer/part-02-00000.npy

Этап 2 для 1B

Для модели 1B можно сделать три прохода обучения, с разным порядком данных, на 50 миллиардах высококачественных токенов, а затем усреднили и сварили модельный суп.

"суп"/"soup" — удобный термин, появившийся где-то в 2022-23 годах. Это метафора: когда варишь суп, нужно в кастрюлю сложить много ингридиентов. В данном случае, это модели, которые усредняются и склеиваются для достижения общего результата.

Контрольная точка

Конфигурация обучения

WandB

случайное зерно 42049

stage2-ingredient1-step23852-tokens50B [29]

OLMo2-1B-stage2-seed42069.yaml [30]

wandb.ai/OLMo2-1B [26]

случайное зерно 666

stage2-ingredient2-step23852-tokens50B [31]

OLMo2-1B-stage2-seed666.yaml [32]

wandb.ai/OLMo2-1B [26]

случайное зерно 42

stage2-ingredient3-step23852-tokens50B [33]

OLMo2-1B-stage2-seed42.yaml [34]

wandb.ai/OLMo2-1B [26]

итоговая смешанная модель

main [35]

нет конфигурации, просто усреднили веса в Python

Этап 2 для 7B

Для модели 7B проводилось три этапа обучения, с разным порядком данных, на 50 миллиардах высококачественных токенов, а затем всё усреднено в модельном супе.

Контрольная точка

Конфигурация обучения

WandB

случайное зерно 42

stage2-ingredient1-step11931-tokens50B [36]

OLMo2-7B-stage2-seed42.yaml [37]

wandb.ai/OLMo2-7B [38]

случайное зерно 42069

stage2-ingredient2-step11931-tokens50B [39]

OLMo2-7B-stage2-seed42069.yaml [40]

wandb.ai/OLMo2-7B [38]

случайное зерно 666

stage2-ingredient3-step11931-tokens50B [41]

OLMo2-7B-stage2-seed666.yaml [42]

wandb.ai/OLMo2-7B [38]

итоговая смешанная модель

main [43]

нет конфигурации, просто усреднили веса в Python

Указанные здесь конфигурации настроены для загрузки последней контрольной точки после этапа 1, чтобы обучение началось прямо с этого момента. Как всегда, можно подшаманить и что-нибудь оптимизировать.

Этап 2 для 13B

Для модели 13B проводилось три этапа обучения с разным порядком данных на 100 миллиардах высококачественных токенов и одно дополнительное обучение на 300 миллиардах высококачественных токенов. Как всегда, результаты сварили в супе.

Контрольная точка

Конфигурация обучения

WandB

случайное зерно 1110, 100B

stage2-ingredient1-step11931-tokens100B [44]

OLMo2-13B-stage2-seed1110-100B.yaml [45]

wandb.ai/OLMo2-13B [28]

случайное зерно 2662, 100B

stage2-ingredient2-step11931-tokens100B [46]

OLMo2-13B-stage2-seed2662-100B.yaml [47]

wandb.ai/OLMo2-13B [28]

случайное зерно 6209, 100B

stage2-ingredient3-step11931-tokens100B [48]

OLMo2-13B-stage2-seed6209-100B.yaml [49]

wandb.ai/OLMo2-13B [28]

случайное зерно 2662, 300B

stage2-ingredient4-step11931-tokens300B [50]

OLMo2-13B-stage2-seed2662-300B.yaml [51]

wandb.ai/OLMo2-13B [28]

итоговая смешанная модель

main [52]

нет конфигурации, мы просто усреднили веса в Python

Так же как и на прошлом этапе, конфигурации настроены для загрузки последнего чекпоинта после этапа 1, чтобы обучение началось прямо с этого момента. Как всегда, можно подшаманить и что-нибудь оптимизировать.

Примечание: Всю информацию о модели 32B можно найти в репозитории OLMo-core [19].

Варианты с инструкциями

По ссылкам доступен полный набор instruct моделей:

Примечание: эти модели специально тренируются, чтобвы выполнять инструкции. Если базовые модели натренированы только на предсказание следующего токена и отлично подходит как база для чего-то большего, то OLMo2 Instruct лучше подходит для ответов на вопросы, суммаризации текстов и так далее. Во флагманских моделях компаний типа Anthropic подразумевается тренировка на соответствие человеческим ценностям, но конкретно в OLMo2 Instruct этим особо не заморачивались. Поэтому, если вы собираетесь использовать модельку в продакшен среде, подумайте что будете делать, когда она ответит пользователю какую-нибудь невероятную дичь.

Инференс

Вы можете использовать интеграцию с Hugging Face для запуска инференса на контрольных точках OLMo Transformers:

from transformers import AutoModelForCausalLM, AutoTokenizer
olmo = AutoModelForCausalLM.from_pretrained("allenai/OLMo-2-0425-1B")
tokenizer = AutoTokenizer.from_pretrained("allenai/OLMo-2-0425-1B")
message = ["Сшит колпак не по колпаковски. Что с колпаком станет, коли колпак переколпаковать?"]
inputs = tokenizer(message, return_tensors='pt', return_token_type_ids=False)
# необязательная проверка cuda
# inputs = {k: v.to('cuda') for k,v in inputs.items()}
# olmo = olmo.to('cuda')
response = olmo.generate(**inputs, max_new_tokens=100, do_sample=True, top_k=50, top_p=0.95)
print(tokenizer.batch_decode(response, skip_special_tokens=True)[0])

Альтернатива — абстракция pipeline от Hugging Face:

from transformers import pipeline
olmo_pipe = pipeline("text-generation", model="allenai/OLMo-2-0425-1B")
print(olmo_pipe("Ехал Грека через реку, видит Грека — в реке что?"))

Квантизация

olmo = AutoModelForCausalLM.from_pretrained("allenai/OLMo-2-0425-1B", torch_dtype=torch.float16, load_in_8bit=True)  # требуется bitsandbytes

Квантизированная модель чувствительна к типам входных данных и обработке CUDA. Чтобы избежать потенциальных проблем, рекомендуется явно преобразовывать входные идентификаторы в CUDA, используя: inputs.input_ids.to [57]('cuda')

Оценка

Дополнительные инструменты для оценки моделей OLMo доступны в репозиториях OLMo Eval [58] и olmes [59].

Хостинг на Modal.com

Modal - довольно популярный зарубежный хостинг [60] для моделей, который используют разработчики OLMo. Купить его карточкой МИР, конечно, нельзя — кроме хостинга [60] типа Cloud.ru [61] у нас не так много опций. Но вот турецкой карточкой — уже можно попробовать.

OLMo: (Миниатюрная) Открытая Языковая Модель - 2

Пример скрипта для размещения модели OLMo 2 на Modal.com [62] с использованием OpenAI API предоставлен в ./scripts/olmo2_modal_openai.py [63]. Для его запуска:

  1. Следуйте инструкциям в разделе "Getting Started" в руководстве [64]Modal.com [62], чтобы установить библиотеку Modal и необходимые консольные утилиты.

  2. Следуйте инструкциям в разделе Secrets [65] руководства Modal.com [62], чтобы создать секрет Modal с именем "example-secret-token", который определяет значение переменной MODAL_TOKEN для вашего сервера.

  3. Затем выполните:

modal deploy ./scripts/olmo2_modal_openai.py

Эндпоинт можно проверить с помощью curl:

curl -X POST 
  -H "Authorization: Bearer [секретный токен из предыдущего шага]" 
  -H "Content-Type: application/json" 
  -d @body.json 
  https://[домен эндпоинта из предыдущей команды]/v1/chat/completions

где body.json имеет формат:

{
    "model": "OLMo-2-1124-13B-Instruct",
    "messages": [
        {
            "role": "user",
            "content": "Что общего у письменного стола и Дональда Трампа?"
        }
      ],
    "max_tokens": 100,
    "temperature": 0.9,
    "stream": true
}

Выводы

Миниатюрная (доступная не только арабским шейхам), качественная, полностью открытая кодовая база, бесплатно. Идеальная штука, чтобы ставить эксперименты и тренироваться в алгоритмах. Лицензия Apache 2.0. Идеалити.

Разработчики не собираются останавливаться на достигнутом, следите за обновлениями их странички на Hugging Face [66].

Автор: DubnovyBlazen

Источник [67]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/opensource/418505

Ссылки в тексте:

[1] лежат на GitHub: https://github.com/allenai/OLMo

[2] PyTorch: https://pytorch.org/

[3] здесь: https://pytorch.org/get-started/locally/

[4] @1red2black: https://t.me/tg_1red2black

[5] OLMo-mix-1124: https://huggingface.co/datasets/allenai/olmo-mix-1124

[6] Dolmino-mix-1124: https://huggingface.co/datasets/allenai/dolmino-mix-1124

[7] OLMo-2 1B: https://github.com/allenai/OLMo/blob/main/configs/official-0425/OLMo-2-0425-1B.csv

[8] OLMo-2 1B: https://github.com/allenai/OLMo/blob/main/configs/official-0425/OLMo-2-0425-1B-stage2.csv

[9] Hugging Face для варианта 1B: https://huggingface.co/allenai/OLMo-2-0425-1B

[10] OLMo-2 7B: https://github.com/allenai/OLMo/blob/main/configs/official-1124/OLMo-2-1124-7B.csv

[11] OLMo-2 7B: https://github.com/allenai/OLMo/blob/main/configs/official-1124/OLMo-2-1124-7B-stage2.csv

[12] Hugging Face для варианта 7B: https://huggingface.co/allenai/OLMo-2-1124-7B

[13] OLMo-2 13B: https://github.com/allenai/OLMo/blob/main/configs/official-1124/OLMo-2-1124-13B.csv

[14] OLMo-2 13B: https://github.com/allenai/OLMo/blob/main/configs/official-1124/OLMo-2-1124-13B-stage2.csv

[15] Hugging Face для варианта 13B: https://huggingface.co/allenai/OLMo-2-1124-13B

[16] OLMo-2 32B: https://github.com/allenai/OLMo-core/blob/main/src/scripts/official/OLMo2-0325-32B.csv

[17] OLMo-2 32B: https://github.com/allenai/OLMo-core/blob/main/src/scripts/official/OLMo-2-0325-32B-stage2.csv

[18] Hugging Face для варианта 32B: https://huggingface.co/allenai/OLMo-2-0325-32B

[19] OLMo-core: https://github.com/allenai/OLMo-core

[20] stage1-step1907359-tokens4001B: https://huggingface.co/allenai/OLMo-2-0425-1B/tree/stage1-step1907359-tokens4001B

[21] stage1-step928646-tokens3896B: https://huggingface.co/allenai/OLMo-2-1124-7B/tree/stage1-step928646-tokens3896B

[22] stage1-step596057-tokens5001B: https://huggingface.co/allenai/OLMo-2-1124-13B/tree/stage1-step596057-tokens5001B

[23] OLMo2-1B-stage1.yaml: https://github.com/allenai/OLMo/blob/main/configs/official-0425/OLMo2-1B-stage1.yaml

[24] OLMo2-7B-stage1.yaml: https://github.com/allenai/OLMo/blob/main/configs/official-1124/OLMo2-7B-stage1.yaml

[25] OLMo2-13B-stage1.yaml: https://github.com/allenai/OLMo/blob/main/configs/official-1124/OLMo2-13B-stage1.yaml

[26] wandb.ai/OLMo2-1B: https://api.wandb.ai/links/ai2-llm/izdtrtu0

[27] wandb.ai/OLMo2-7B: https://wandb.ai/ai2-llm/OLMo-2-1124-7B/reports/OLMo-2-7B-Nov-2024--VmlldzoxMDUzMzE1OA

[28] wandb.ai/OLMo2-13B: https://wandb.ai/ai2-llm/OLMo-2-1124-13B/reports/OLMo-2-13B-Nov-2024--VmlldzoxMDUzMjQxNg

[29] stage2-ingredient1-step23852-tokens50B: https://huggingface.co/allenai/OLMo-2-0425-1B/tree/stage2-ingredient1-step23852-tokens51B

[30] OLMo2-1B-stage2-seed42069.yaml: https://claude.ai/chat/configs/official-0425/OLMo2-1B-stage2-seed42069.yaml

[31] stage2-ingredient2-step23852-tokens50B: https://huggingface.co/allenai/OLMo-2-0425-1B/tree/stage2-ingredient2-step23852-tokens51B

[32] OLMo2-1B-stage2-seed666.yaml: https://claude.ai/chat/configs/official-0425/OLMo2-1B-stage2-seed666.yaml

[33] stage2-ingredient3-step23852-tokens50B: https://huggingface.co/allenai/OLMo-2-0425-1B/tree/stage2-ingredient3-step23852-tokens51B

[34] OLMo2-1B-stage2-seed42.yaml: https://claude.ai/chat/configs/official-0425/OLMo2-1B-stage2-seed42.yaml

[35] main: https://huggingface.co/allenai/OLMo-2-0425-1B/tree/main

[36] stage2-ingredient1-step11931-tokens50B: https://huggingface.co/allenai/OLMo-2-1124-7B/tree/stage2-ingredient1-step11931-tokens50B

[37] OLMo2-7B-stage2-seed42.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-7B-stage2-seed42.yaml

[38] wandb.ai/OLMo2-7B: https://wandb.ai/ai2-llm/OLMo-2-1124-7B/reports/

[39] stage2-ingredient2-step11931-tokens50B: https://huggingface.co/allenai/OLMo-2-1124-7B/tree/stage2-ingredient2-step11931-tokens50B

[40] OLMo2-7B-stage2-seed42069.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-7B-stage2-seed42069.yaml

[41] stage2-ingredient3-step11931-tokens50B: https://huggingface.co/allenai/OLMo-2-1124-7B/tree/stage2-ingredient3-step11931-tokens50B

[42] OLMo2-7B-stage2-seed666.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-7B-stage2-seed666.yaml

[43] main: https://huggingface.co/allenai/OLMo-2-1124-7B/tree/main

[44] stage2-ingredient1-step11931-tokens100B: https://huggingface.co/allenai/OLMo-2-1124-13B/tree/stage2-ingredient1-step11931-tokens100B

[45] OLMo2-13B-stage2-seed1110-100B.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-13B-stage2-seed1110-100B.yaml

[46] stage2-ingredient2-step11931-tokens100B: https://huggingface.co/allenai/OLMo-2-1124-13B/tree/stage2-ingredient2-step11931-tokens100B

[47] OLMo2-13B-stage2-seed2662-100B.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-13B-stage2-seed2662-100B.yaml

[48] stage2-ingredient3-step11931-tokens100B: https://huggingface.co/allenai/OLMo-2-1124-13B/tree/stage2-ingredient3-step11931-tokens100B

[49] OLMo2-13B-stage2-seed6209-100B.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-13B-stage2-seed6209-100B.yaml

[50] stage2-ingredient4-step11931-tokens300B: https://huggingface.co/allenai/OLMo-2-1124-13B/tree/stage2-ingredient4-step35773-tokens300B

[51] OLMo2-13B-stage2-seed2662-300B.yaml: https://claude.ai/chat/configs/official-1124/OLMo2-13B-stage2-seed2662-300B.yaml

[52] main: https://huggingface.co/allenai/OLMo-2-1124-13B/tree/main

[53] OLMo2 1B Instruct: https://huggingface.co/allenai/OLMo-2-0425-1B-Instruct

[54] OLMo2 7B Instruct: https://huggingface.co/allenai/OLMo-2-1124-7B-Instruct

[55] OLMo2 13B Instruct: https://huggingface.co/allenai/OLMo-2-1124-13B-Instruct

[56] OLMo2 32B Instruct: https://huggingface.co/allenai/OLMo-2-0325-32B-Instruct

[57] ids.to: http://ids.to

[58] OLMo Eval: https://github.com/allenai/OLMo-eval

[59] olmes: https://github.com/allenai/olmes

[60] хостинг: https://www.reg.ru/?rlink=reflink-717

[61] Cloud.ru: https://cloud.ru/products/vychislitelnyye-moschnosti-s-gpu

[62] Modal.com: http://Modal.com

[63] openai.py: http://openai.py

[64] руководстве : https://modal.com/docs/guide

[65] Secrets: https://modal.com/docs/guide/secrets

[66] странички на Hugging Face: https://huggingface.co/allenai

[67] Источник: https://habr.com/ru/companies/bar/articles/906500/?utm_campaign=906500&utm_source=habrahabr&utm_medium=rss