В llama2.c один из вопросов, который я больше всего хочу знать: как прочитать и запустить файл модели (bin) вручную (c)? В общем, есть несколько вопросов:
До реализации Карпат они всегда считались запретной зоной для крупных производителей и невыполнимой задачей. После просмотра подробной серии руководств, таких как микро-град и нано-gpt, я узнал, что Карпати хорошо умеет использовать базовые языки для создания компонентов игрушечных колес, а затем выполнять полную игрушечную работу. Я потратил 2 дня свободного времени на чтение кода, рисование структурной схемы и примерное метафизическое понимание механизма, прежде чем моя память затуманилась или отвлеклась на другие вещи, я записывал заметки для ностальгии. Дизайн такой красивый! !
run.c реализует три класса структуры. Подробности можно увидеть в коде. Рисунок легче понять, чем сам код.
Среди них структуры Config и TransformerWeight считываются и анализируются двоичным файлом model.bin. Вместе они представляют собой структуру модели, а вес RunState — контекст времени выполнения.
Это также отвечает на вопрос реализации оператора. Помимо запуска финальной обработки токена и pos, Llama2 LLM является повторением стандартизированного блока Transformer. Отличием конкретной серии моделей является размер блока Transformer и конфигурация форматирования, а количество используемых операторов ограничено.
Просто прочитайте файл tokenizer.bin, экспортируйте два объекта типа поиска, а затем выполните процесс для каждого токена...
argmax и sample используются для обработки с температурными параметрами или без них.
Основной процесс run.c очень традиционен, и ощущение «он должен быть спроектирован таким образом» очень ортодоксально, а изысканный дизайн заключается в дизайне структуры.
Проще говоря: model.py::export --> bin --> run.c::Config TransformerWeight, специально в сочетании с рисунком ниже, посмотрите на следующий код:
В частности, следует отметить, что веса хранятся в группах в соответствии с порядком типа оператора (Внимание, ffn), а затем слоя слоя; все переменные в TransfoermerWeight являются указателями на пространство, где фактически хранятся веса, и они основаны на первом анализе информационного приложения Come Out Config. Такая конструкция гарантирует, что структуры Config и TransformerWeight занимают одно и то же пространство (независимо от размера модели).
Нет времени или мало смысла сравнивать выводы механизма вывода Python и C, а также недостаточно времени, чтобы проследить код run.c за один шаг, чтобы увидеть поток данных;