Transformers documentation
CodeLlama
Mô hình này được công bố trên HF papers vào ngày 2023-08-24 và được đóng góp cho Hugging Face Transformers vào ngày 2023-08-25.
CodeLlama
Code Llama là một dòng mô hình ngôn ngữ lớn chuyên dụng dựa trên Llama 2 cho các tác vụ lập trình. Nó có các biến thể khác nhau - mã nguồn tổng quát, riêng cho Python, và biến thể tuân theo chỉ dẫn - tất cả đều có sẵn với 7B, 13B, 34B và 70B tham số. Các mô hình Code Llama có thể tạo, giải thích và thậm chí điền vào các phần còn thiếu trong mã nguồn của bạn (gọi là “infilling”). Nó cũng có thể xử lý các ngữ cảnh rất dài với khả năng tạo ổn định lên đến 100k token, mặc dù được huấn luyện trên các chuỗi 16K token.
Bạn có thể tìm thấy tất cả các checkpoint gốc của Code Llama trong bộ sưu tập Code Llama.
Nhấp vào các mô hình Code Llama ở thanh bên phải để xem thêm các ví dụ về cách áp dụng Code Llama cho các tác vụ lập trình khác nhau.
Ví dụ dưới đây minh họa cách tạo mã bằng Pipeline, hoặc AutoModel, và từ dòng lệnh.
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)Quantization giảm gánh nặng bộ nhớ của các mô hình lớn bằng cách biểu diễn trọng số ở độ chính xác thấp hơn. Tham khảo tổng quan về Quantization để biết thêm các backend quantization khả dụng.
Ví dụ bên dưới sử dụng bitsandbytes để chỉ lượng tử hóa trọng số xuống 4-bit.
# 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))Sử dụng AttentionMaskVisualizer để hiểu rõ hơn về các token mà mô hình có thể và không thể chú ý đến.
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")
Ghi chú
Infilling chỉ khả dụng trong các mô hình base 7B và 13B, và không có trong các mô hình Python, Instruct, 34B hoặc 70B.
Sử dụng token
<FILL_ME>tại vị trí bạn muốn nhập liệu được điền vào. Tokenizer sẽ tách token này để tạo chuỗi đầu vào đã định dạng, tuân theo mẫu huấn luyện ban đầu. Cách này bền vững hơn so với việc tự chuẩn bị mẫu.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))Sử dụng
bfloat16để huấn luyện thêm hoặc tinh chỉnh vàfloat16để suy luận.Ký tự
BOSkhông được sử dụng để infilling khi mã hóa phần prefix hoặc suffix, mà chỉ được đặt ở đầu mỗi prompt.Tokenizer là một mô hình mã hóa cặp byte dựa trên SentencePiece. Trong quá trình giải mã, nếu token đầu tiên là phần bắt đầu của từ (ví dụ: “Banana”), tokenizer sẽ không thêm khoảng trắng tiền tố vào chuỗi.
CodeLlamaTokenizer
lớp 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 )
Tham số
- clean_up_tokenization_spaces (
str, tùy chọn, mặc định làFalse) — Có nên dọn dẹp khoảng trắng sau khi giải mã hay không; việc dọn dẹp bao gồm việc loại bỏ các sản phẩm phụ tiềm ẩn như khoảng trắng thừa. - unk_token (
str, tùy chọn, mặc định là"<unk>") — Token không xác định. Một token không có trong từ vựng sẽ không thể được chuyển đổi thành ID và sẽ được gán thành token này thay thế. - bos_token (
str, tùy chọn, mặc định là"<s>") — Token bắt đầu chuỗi được sử dụng trong quá trình tiền huấn luyện. Có thể được dùng làm token phân loại chuỗi. - eos_token (
str, tùy chọn, mặc định là"</s>") — Token kết thúc chuỗi. - prefix_token (
str, tùy chọn, mặc định là"▁<PRE>") — Token tiền tố được sử dụng cho việc điền vào chỗ trống (infilling). - middle_token (
str, tùy chọn, mặc định là"▁<MID>") — Token ở giữa được sử dụng cho việc điền vào chỗ trống (infilling). - suffix_token (
str, tùy chọn, mặc định là"▁<SUF>") — Token hậu tố được sử dụng cho việc điền vào chỗ trống (infilling). - eot_token (
str, tùy chọn, mặc định là"▁<EOT>") — Token kết thúc văn bản được sử dụng cho infilling. - fill_token (
str, tuỳ chọn, mặc định là"<FILL_ME>") — Token được sử dụng để tách đầu vào giữa phần tiền tố và phần hậu tố. - additional_special_tokens (
list[str], tùy chọn) — Các token đặc biệt bổ sung được sử dụng bởi tokenizer. - add_bos_token (
bool, tùy chọn, mặc định làTrue) — Có thêm token đầu chuỗi (beginning of sequence) ở đầu các chuỗi hay không. - add_eos_token (
bool, tùy chọn, mặc định làFalse) — Có thêm token kết thúc chuỗi ở cuối các chuỗi hay không. - use_default_system_prompt (
bool, tùy chọn, mặc định làFalse) — Xác định có nên sử dụng system prompt mặc định cho Llama hay không. - add_prefix_space (
bool, tùy chọn) — Có thêm một khoảng trắng ban đầu vào đầu vào hay không. Điều này cho phép xử lý từ đầu tiên giống như bất kỳ từ nào khác. - vocab (
str,dicthoặclist, tùy chọn) — Từ điển từ vựng tùy chỉnh. Nếu không được cung cấp, từ vựng sẽ được tải từ vocab_file. - merges (
strhoặclist, tùy chọn) — Danh sách merges tùy chỉnh. Nếu không được cung cấp, merges sẽ được tải từ merges_file. - vocab_file (
str, tùy chọn) — tệp SentencePiece (thường có phần mở rộng .model) chứa từ vựng cần thiết để khởi tạo một tokenizer.
Xây dựng một tokenizer Llama. Dựa trên Byte-Pair-Encoding ở mức byte.
Điều này sử dụng đáng chú ý ByteFallback và không có chuẩn hóa.
>>> 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]Nếu bạn muốn thay đổi bos_token hoặc eos_token, hãy đảm bảo chỉ định chúng khi khởi tạo mô hình, hoặc
gọi tokenizer.update_post_processor() để đảm bảo rằng quá trình hậu xử lý được thực hiện chính xác (nếu không,
giá trị của token đầu tiên và token cuối cùng của một chuỗi đã mã hóa sẽ không chính xác). Để biết thêm chi tiết, hãy xem tài liệu
[post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Tokenizer này kế thừa từ PreTrainedTokenizerFast, bao gồm hầu hết các phương thức chính. Người dùng nên tham khảo lớp cha này để biết thêm thông tin về các phương thức đó. Cấu hình mặc định khớp với meta-llama/CodeLlama-7b-Instruct-hf, hỗ trợ 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]
Tham số
- token_ids_0 — Danh sách các ID của chuỗi (có thể đã được định dạng).
- token_ids_1 — Không được sử dụng khi
already_has_special_tokens=True. Trong trường hợp đó, giá trị phải là None. - already_has_special_tokens — Xác định xem chuỗi đã được định dạng với các token đặc biệt hay chưa.
Trả về
Một danh sách các số nguyên trong khoảng [0, 1]
1 cho token đặc biệt, 0 cho token chuỗi.
Lấy các id chuỗi từ một danh sách token không có token đặc biệt nào được thêm vào.
Đối với các tokenizer nhanh, các data collator gọi hàm này với already_has_special_tokens=True để xây dựng một mask trên một chuỗi đã được định dạng sẵn. Trong trường hợp đó, chúng ta tính mask bằng cách kiểm tra sự thuộc về trong all_special_ids.
Cập nhật bộ xử lý hậu xử lý (post processor) bên dưới với bos_token và eos_token hiện tại.
CodeLlamaTokenizerFast
lớp 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 )
Tham số
- clean_up_tokenization_spaces (
str, tùy chọn, mặc định làFalse) — Có nên dọn dẹp khoảng trắng sau khi giải mã hay không; việc dọn dẹp bao gồm việc loại bỏ các sản phẩm phụ tiềm ẩn như khoảng trắng thừa. - unk_token (
str, tùy chọn, mặc định là"<unk>") — Token không xác định. Một token không có trong từ vựng sẽ không thể được chuyển đổi thành ID và sẽ được gán thành token này thay thế. - bos_token (
str, tùy chọn, mặc định là"<s>") — Token bắt đầu chuỗi được sử dụng trong quá trình tiền huấn luyện. Có thể được dùng làm token phân loại chuỗi. - eos_token (
str, tùy chọn, mặc định là"</s>") — Token kết thúc chuỗi. - prefix_token (
str, tùy chọn, mặc định là"▁<PRE>") — Token tiền tố được sử dụng cho việc điền vào chỗ trống (infilling). - middle_token (
str, tùy chọn, mặc định là"▁<MID>") — Token ở giữa được sử dụng cho việc điền vào chỗ trống (infilling). - suffix_token (
str, tùy chọn, mặc định là"▁<SUF>") — Token hậu tố được sử dụng cho việc điền vào chỗ trống (infilling). - eot_token (
str, tùy chọn, mặc định là"▁<EOT>") — Token kết thúc văn bản được sử dụng cho infilling. - fill_token (
str, tuỳ chọn, mặc định là"<FILL_ME>") — Token được sử dụng để tách đầu vào giữa phần tiền tố và phần hậu tố. - additional_special_tokens (
list[str], tùy chọn) — Các token đặc biệt bổ sung được sử dụng bởi tokenizer. - add_bos_token (
bool, tùy chọn, mặc định làTrue) — Có thêm token đầu chuỗi (beginning of sequence) ở đầu các chuỗi hay không. - add_eos_token (
bool, tùy chọn, mặc định làFalse) — Có thêm token kết thúc chuỗi ở cuối các chuỗi hay không. - use_default_system_prompt (
bool, tùy chọn, mặc định làFalse) — Xác định có nên sử dụng system prompt mặc định cho Llama hay không. - add_prefix_space (
bool, tùy chọn) — Có thêm một khoảng trắng ban đầu vào đầu vào hay không. Điều này cho phép xử lý từ đầu tiên giống như bất kỳ từ nào khác. - vocab (
str,dicthoặclist, tùy chọn) — Từ điển từ vựng tùy chỉnh. Nếu không được cung cấp, từ vựng sẽ được tải từ vocab_file. - merges (
strhoặclist, tùy chọn) — Danh sách merges tùy chỉnh. Nếu không được cung cấp, merges sẽ được tải từ merges_file. - vocab_file (
str, tùy chọn) — tệp SentencePiece (thường có phần mở rộng .model) chứa từ vựng cần thiết để khởi tạo một tokenizer.
Xây dựng một tokenizer Llama. Dựa trên Byte-Pair-Encoding ở mức byte.
Điều này sử dụng đáng chú ý ByteFallback và không có chuẩn hóa.
>>> 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]Nếu bạn muốn thay đổi bos_token hoặc eos_token, hãy đảm bảo chỉ định chúng khi khởi tạo mô hình, hoặc
gọi tokenizer.update_post_processor() để đảm bảo rằng quá trình hậu xử lý được thực hiện chính xác (nếu không,
giá trị của token đầu tiên và token cuối cùng của một chuỗi đã mã hóa sẽ không chính xác). Để biết thêm chi tiết, hãy xem tài liệu
[post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Tokenizer này kế thừa từ PreTrainedTokenizerFast, bao gồm hầu hết các phương thức chính. Người dùng nên tham khảo lớp cha này để biết thêm thông tin về các phương thức đó. Cấu hình mặc định khớp với meta-llama/CodeLlama-7b-Instruct-hf, hỗ trợ prompt infilling.
Cập nhật normalizer để đảm bảo định dạng prompt cho infilling được tuân thủ. Định dạng infilling như sau: if suffix_first
” <PRE> <SUF>{suf} <MID> {pre}”
else:
” <PRE> {pre} <SUF>{suf} <MID>”
Nếu reset được đặt thành True, normalizer và post_processor sẽ được đặt lại về hành vi “bình thường” của chúng, tức là thêm một khoảng trắng tiền tố cho normalizer và thêm bos_token vào văn bản đầu vào cho post_processor.