Transformers documentation
CodeLlama
Эта модель была опубликована в HF papers 24.08.2023 и добавлена в Hugging Face Transformers 25.08.2023.
CodeLlama
Code Llama — это специализированное семейство больших языковых моделей на базе Llama 2, предназначенное для задач программирования. Модель доступна в нескольких вариантах: для общего кода, специфичном для Python и вариант, следующий инструкциям; все они представлены в версиях с 7B, 13B, 34B и 70B параметров. Модели Code Llama способны генерировать код, объяснять его и даже заполнять пропущенные фрагменты (так называемый «infilling»). Кроме того, модель стабильно обрабатывает очень длинные контексты вплоть до 100k токенов, несмотря на то, что обучалась на последовательностях длиной 16K токенов.
Все исходные контрольные точки Code Llama можно найти в коллекции Code Llama.
Щёлкните по моделям Code Llama в боковой панели справа, чтобы увидеть больше примеров применения Code Llama к различным задачам программирования.
Приведённый ниже пример показывает, как генерировать код с помощью Pipeline, AutoModel или из командной строки.
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
device_map=0
)
# basic code generation
result = pipe("# Function to calculate the factorial of a number\ndef factorial(n):", max_new_tokens=256)
print(result[0]['generated_text'])
# infilling
infill_result = pipe("def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result", max_new_tokens=200)
print(infill_result[0]['generated_text'])from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-7b-hf",
device_map="auto",
attn_implementation="sdpa"
)
# basic code generation
prompt = "# Function to calculate the factorial of a number\ndef factorial(n):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(
**input_ids,
max_new_tokens=256,
cache_implementation="static"
)
print(tokenizer.decode(output[0], skip_special_tokens=True))
# infilling
infill_prompt = "def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result"
input_ids = tokenizer(infill_prompt, return_tensors="pt").to(model.device)
filled_output = model.generate(**input_ids, max_new_tokens=200)
filled_text = tokenizer.decode(filled_output[0], skip_special_tokens=True)
print(filled_text)Квантование снижает нагрузку на память при работе с большими моделями, представляя веса в пониженной точности. Подробнее о доступных бэкендах квантования см. в обзоре Квантование.
Приведённый ниже пример использует bitsandbytes для квантования только весов до 4 бит.
# pip install bitsandbytes
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, CodeLlamaTokenizer
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True)
tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-34b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-34b-hf",
device_map="auto",
quantization_config=bnb_config
)
prompt = "# Write a Python function to check if a string is a palindrome\ndef is_palindrome(s):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(**input_ids, max_new_tokens=200, cache_implementation="static")
print(tokenizer.decode(output[0], skip_special_tokens=True))Используйте AttentionMaskVisualizer, чтобы лучше понять, к каким токенам модель может и не может обращать внимание.
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")
Примечания
Функция Infilling доступна только в базовых моделях 7B и 13B, но не в моделях Python, Instruct, 34B или 70B.
Используйте токен
<FILL_ME>в том месте, где вы хотите, чтобы ввод был заполнен. Токенизатор разбивает этот токен, чтобы создать строку входных данных в формате, соответствующем исходному шаблону обучения. Это более надёжный подход, чем самостоятельная подготовка шаблона.from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf") model = LlamaForCausalLM.from_pretrained("meta-llama/CodeLlama-7b-hf", device_map="auto") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt").to(model.device)["input_ids"] generated_ids = model.generate(input_ids, max_new_tokens=128) filling = tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokens = True)[0] print(PROMPT.replace("<FILL_ME>", filling))Используйте
bfloat16для дальнейшего обучения или дообучения, аfloat16— для инференса.Символ
BOSне используется при кодировании префикса или суффикса для заполнения пропусков, а появляется только в начале каждого запроса.Токенизатор представляет собой модель байтового парного кодирования, основанную на SentencePiece. При декодировании, если первый токен является началом слова (например, «Banana»), токенезатор не добавляет пробел-префикс к строке.
CodeLlamaTokenizer
класс transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_token = '<unk>'bos_token = '<s>'eos_token = '</s>'prefix_token = '▁<PRE>'middle_token = '▁<MID>'suffix_token = '▁<SUF>'eot_token = '▁<EOT>'fill_token = '<FILL_ME>'additional_special_tokens = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
Параметры
- clean_up_tokenization_spaces (
str, необязательный, по умолчаниюFalse) — Указывает, следует ли очищать пробелы после декодирования. Очистка заключается в удалении возможных артефактов, например лишних пробелов. - unk_token (
str, необязательный, по умолчанию"<unk>") — Токен неизвестного слова. Токен, отсутствующий в словаре, не может быть преобразован в ID, поэтому вместо него используется этот токен. - bos_token (
str, необязательный, по умолчанию"<s>") — Токен начала последовательности, использовавшийся при предварительном обучении. Может применяться в качестве токена классификатора последовательности. - eos_token (
str, необязательный, по умолчанию"</s>") — Токен конца последовательности. - prefix_token (
str, необязательный, по умолчанию"▁<PRE>") — Токен префикса, используемый для infilling. - middle_token (
str, необязательный, по умолчанию"▁<MID>") — Средний токен, используемый для infilling. - suffix_token (
str, необязательный, по умолчанию"▁<SUF>") — Токен суффикса, используемый для infilling. - eot_token (
str, необязательный, по умолчанию"▁<EOT>") — Токен конца текста, используемый для infilling. - fill_token (
str, необязательный, по умолчанию"<FILL_ME>") — Токен, используемый для разделения входных данных на префикс и суффикс. - additional_special_tokens (
list[str], необязательный) — Дополнительные специальные токены, используемые токенизатором. - add_bos_token (
bool, необязательный, по умолчаниюTrue) — Указывает, нужно ли добавлять токен начала последовательности в начало последовательностей. - add_eos_token (
bool, необязательный, по умолчаниюFalse) — Добавлять ли токен конца последовательности в конец последовательностей. - use_default_system_prompt (
bool, необязательный, по умолчаниюFalse) — Указывает, следует ли использовать системный промпт по умолчанию для Llama. - add_prefix_space (
bool, необязательный) — Добавлять ли начальный пробел к входным данным. Это позволяет обрабатывать первое слово так же, как и любое другое. - vocab (
str,dictorlist, необязательный) — Пользовательский словарь. Если не указан, словарь загружается из vocab_file. - merges (
strилиlist, необязательный) — Список пользовательских слияний. Если не указан, слияния загружаются из merges_file. - vocab_file (
str, необязательный) — файл SentencePiece (обычно с расширением .model), содержащий словарь, необходимый для создания токенизатора.
Создайте токенизатор Llama. Основан на байтовом уровне Byte-Pair-Encoding.
Здесь заметно используется ByteFallback и не выполняется нормализация.
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]Если вы хотите изменить bos_token или eos_token, убедитесь, что вы указали их при инициализации модели, или
вызовите tokenizer.update_post_processor(), чтобы убедиться, что постобработка выполняется корректно (иначе
значения первого и последнего токена закодированной последовательности будут неверными). Дополнительные сведения см. в
документации [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Этот токенизатор наследуется от PreTrainedTokenizerFast, который содержит большинство основных методов. За дополнительной информацией об этих методах следует обращаться к этому суперклассу. Конфигурация по умолчанию соответствует конфигурации meta-llama/CodeLlama-7b-Instruct-hf, которая поддерживает заполнение промптов (prompt infilling).
get_special_tokens_mask
< source >( token_ids_0: list[int]token_ids_1: list[int] | None = Nonealready_has_special_tokens: bool = False ) → A list of integers in the range [0, 1]
Параметры
- token_ids_0 — список идентификаторов для (возможно, уже отформатированной) последовательности.
- token_ids_1 — Не используется, если
already_has_special_tokens=True. В этом случае должно быть None. - already_has_special_tokens — Указывает, содержит ли последовательность уже отформатированные специальные токены.
Возвращает
Список целых чисел в диапазоне [0, 1]
1 для специального токена, 0 для токена последовательности.
Получить идентификаторы последовательностей из списка токенов, в который не добавлены специальные токены.
Для быстрых токенизаторов коллабораторы данных вызывают этот метод с already_has_special_tokens=True, чтобы построить маску для уже отформатированной последовательности. В этом случае мы вычисляем маску, проверяя принадлежность элементов к all_special_ids.
Обновляет базовый постпроцессор с использованием текущих bos_token и eos_token.
CodeLlamaTokenizerFast
класс transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_token = '<unk>'bos_token = '<s>'eos_token = '</s>'prefix_token = '▁<PRE>'middle_token = '▁<MID>'suffix_token = '▁<SUF>'eot_token = '▁<EOT>'fill_token = '<FILL_ME>'additional_special_tokens = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
Параметры
- clean_up_tokenization_spaces (
str, необязательный, по умолчаниюFalse) — Указывает, следует ли очищать пробелы после декодирования. Очистка заключается в удалении возможных артефактов, например лишних пробелов. - unk_token (
str, необязательный, по умолчанию"<unk>") — Токен неизвестного слова. Токен, отсутствующий в словаре, не может быть преобразован в ID, поэтому вместо него используется этот токен. - bos_token (
str, необязательный, по умолчанию"<s>") — Токен начала последовательности, использовавшийся при предварительном обучении. Может применяться в качестве токена классификатора последовательности. - eos_token (
str, необязательный, по умолчанию"</s>") — Токен конца последовательности. - prefix_token (
str, необязательный, по умолчанию"▁<PRE>") — Токен префикса, используемый для infilling. - middle_token (
str, необязательный, по умолчанию"▁<MID>") — Средний токен, используемый для infilling. - suffix_token (
str, необязательный, по умолчанию"▁<SUF>") — Токен суффикса, используемый для infilling. - eot_token (
str, необязательный, по умолчанию"▁<EOT>") — Токен конца текста, используемый для infilling. - fill_token (
str, необязательный, по умолчанию"<FILL_ME>") — Токен, используемый для разделения входных данных на префикс и суффикс. - additional_special_tokens (
list[str], необязательный) — Дополнительные специальные токены, используемые токенизатором. - add_bos_token (
bool, необязательный, по умолчаниюTrue) — Указывает, нужно ли добавлять токен начала последовательности в начало последовательностей. - add_eos_token (
bool, необязательный, по умолчаниюFalse) — Добавлять ли токен конца последовательности в конец последовательностей. - use_default_system_prompt (
bool, необязательный, по умолчаниюFalse) — Указывает, следует ли использовать системный промпт по умолчанию для Llama. - add_prefix_space (
bool, необязательный) — Добавлять ли начальный пробел к входным данным. Это позволяет обрабатывать первое слово так же, как и любое другое. - vocab (
str,dictorlist, необязательный) — Пользовательский словарь. Если не указан, словарь загружается из vocab_file. - merges (
strилиlist, необязательный) — Список пользовательских слияний. Если не указан, слияния загружаются из merges_file. - vocab_file (
str, необязательный) — файл SentencePiece (обычно с расширением .model), содержащий словарь, необходимый для создания токенизатора.
Создайте токенизатор Llama. Основан на байтовом уровне Byte-Pair-Encoding.
Здесь заметно используется ByteFallback и не выполняется нормализация.
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]Если вы хотите изменить bos_token или eos_token, убедитесь, что вы указали их при инициализации модели, или
вызовите tokenizer.update_post_processor(), чтобы убедиться, что постобработка выполняется корректно (иначе
значения первого и последнего токена закодированной последовательности будут неверными). Дополнительные сведения см. в
документации [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Этот токенизатор наследуется от PreTrainedTokenizerFast, который содержит большинство основных методов. За дополнительной информацией об этих методах следует обращаться к этому суперклассу. Конфигурация по умолчанию соответствует конфигурации meta-llama/CodeLlama-7b-Instruct-hf, которая поддерживает заполнение промптов.
Обновляет нормализатор, чтобы гарантировать соблюдение формата промпта для infilling. Формат infilling выглядит следующим образом: if suffix_first
” <PRE> <SUF>{suf} <MID> {pre}”
else:
” <PRE> {pre} <SUF>{suf} <MID>”
Если reset установлен в True, normalizer и post_processor возвращаются к своему «обычному» поведению, которое заключается в добавлении пробела в начале для normalizer и добавлении bos_token к входному тексту для post_processor.