Transformers documentation

CodeLlama

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Эта модель была опубликована в 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 или из командной строки.

Пайплайн
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'])

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

Приведённый ниже пример использует 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

< >

( 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, dict or list, необязательный) — Пользовательский словарь. Если не указан, словарь загружается из 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

< >

( 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.

update_post_processor

< >

( )

Обновляет базовый постпроцессор с использованием текущих bos_token и eos_token.

save_vocabulary

< >

( save_directory: strfilename_prefix: str | None = None )

CodeLlamaTokenizerFast

класс transformers.CodeLlamaTokenizer

< >

( 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, dict or list, необязательный) — Пользовательский словарь. Если не указан, словарь загружается из 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, которая поддерживает заполнение промптов.

set_infilling_processor

< >

( resetsuffix_first = Falseadd_special_tokens = True )

Обновляет нормализатор, чтобы гарантировать соблюдение формата промпта для 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.

Update on GitHub