Aston-xMAD commited on
Commit
b37c16f
1 Parent(s): 98faf6f

init commit

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. README.md +3 -2
  2. app.py +179 -0
  3. backups/app_default_inf-api.py +63 -0
  4. backups/app_local copy.py +142 -0
  5. backups/app_local_not_working.py +165 -0
  6. backups/app_local_not_working_2.py +150 -0
  7. backups/app_v0.py +81 -0
  8. backups/app_v1.py +128 -0
  9. backups/app_v1_faster.py +123 -0
  10. backups/app_v2_enabled_streaming.py +113 -0
  11. backups/app_v3.py +110 -0
  12. backups/app_v4_fast.py +72 -0
  13. benchmark_utils.py +95 -0
  14. chats.json +1850 -0
  15. docker/transformers-all-latest-gpu/Dockerfile +63 -0
  16. docker/transformers-doc-builder/Dockerfile +18 -0
  17. docker/transformers-gpu/Dockerfile +31 -0
  18. docker/transformers-past-gpu/Dockerfile +59 -0
  19. docker/transformers-pytorch-amd-gpu/Dockerfile +39 -0
  20. docker/transformers-pytorch-deepspeed-amd-gpu/Dockerfile +48 -0
  21. docker/transformers-pytorch-deepspeed-latest-gpu/Dockerfile +53 -0
  22. docker/transformers-pytorch-deepspeed-nightly-gpu/Dockerfile +64 -0
  23. docker/transformers-pytorch-gpu/Dockerfile +33 -0
  24. docker/transformers-pytorch-tpu/Dockerfile +65 -0
  25. docker/transformers-pytorch-tpu/bert-base-cased.jsonnet +38 -0
  26. docker/transformers-pytorch-tpu/dataset.yaml +32 -0
  27. docker/transformers-pytorch-tpu/docker-entrypoint.sh +8 -0
  28. docker/transformers-quantization-latest-gpu/Dockerfile +60 -0
  29. docker/transformers-tensorflow-gpu/Dockerfile +25 -0
  30. docs/README.md +397 -0
  31. docs/TRANSLATING.md +57 -0
  32. docs/source/_config.py +14 -0
  33. docs/source/de/_config.py +14 -0
  34. docs/source/de/_toctree.yml +42 -0
  35. docs/source/de/accelerate.md +136 -0
  36. docs/source/de/add_new_model.md +891 -0
  37. docs/source/de/add_new_pipeline.md +254 -0
  38. docs/source/de/autoclass_tutorial.md +131 -0
  39. docs/source/de/contributing.md +334 -0
  40. docs/source/de/index.md +334 -0
  41. docs/source/de/installation.md +250 -0
  42. docs/source/de/llm_tutorial.md +221 -0
  43. docs/source/de/model_sharing.md +232 -0
  44. docs/source/de/peft.md +216 -0
  45. docs/source/de/pipeline_tutorial.md +175 -0
  46. docs/source/de/pr_checks.md +199 -0
  47. docs/source/de/preprocessing.md +506 -0
  48. docs/source/de/quicktour.md +438 -0
  49. docs/source/de/run_scripts.md +351 -0
  50. docs/source/de/testing.md +1293 -0
README.md CHANGED
@@ -1,12 +1,13 @@
1
  ---
2
  title: 1bit Llama3 Instruct Xmad Chatbot
3
- emoji: 👁
4
  colorFrom: blue
5
- colorTo: purple
6
  sdk: gradio
7
  sdk_version: 4.39.0
8
  app_file: app.py
9
  pinned: false
 
10
  ---
11
 
12
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
  title: 1bit Llama3 Instruct Xmad Chatbot
3
+ emoji:
4
  colorFrom: blue
5
+ colorTo: green
6
  sdk: gradio
7
  sdk_version: 4.39.0
8
  app_file: app.py
9
  pinned: false
10
+ license: llama3
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import platform
3
+ import sys
4
+ import time
5
+ import boto3
6
+ from botocore.exceptions import NoCredentialsError
7
+ import logging
8
+
9
+ import gradio as gr
10
+ import torch
11
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
12
+
13
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
14
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
15
+ # device = "cuda"
16
+
17
+ # has_gpu = torch.cuda.is_available()
18
+ # device = "cuda" if has_gpu else "cpu"
19
+
20
+ # print(f"Python Platform: {platform.platform()}")
21
+ # print(f"Python Version: {sys.version}")
22
+ # print(f"PyTorch Version: {torch.__version__}")
23
+ # print("GPU Availability:", "Available" if has_gpu else "Not Available")
24
+ # print(f"Target Device: {device}")
25
+
26
+ # if has_gpu:
27
+ # print(f"GPU Type: {torch.cuda.get_device_name(0)}")
28
+ # print(f"CUDA Version: {torch.version.cuda}")
29
+ # else:
30
+ # print("CUDA is not available.")
31
+
32
+ def download_xmad_file():
33
+ s3 = boto3.client('s3',
34
+ aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),
35
+ aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY'))
36
+
37
+ # Create the .codebooks directory if it doesn't exist
38
+ codebooks_dir = '.codebooks'
39
+ os.makedirs(codebooks_dir, exist_ok=True)
40
+
41
+ temp_file_path = os.path.join(codebooks_dir, 'llama-3-8b-instruct_1bit.xmad')
42
+
43
+ try:
44
+ # Download the file to the .codebooks directory
45
+ s3.download_file('xmad-quantized-models', 'llama-3-8b-instruct_1bit.xmad', temp_file_path)
46
+ print("Download Successful")
47
+
48
+ # Restrict permissions on the .codebooks directory
49
+ os.chmod(codebooks_dir, 0o700)
50
+
51
+ except NoCredentialsError:
52
+ print("Credentials not available")
53
+
54
+ download_xmad_file()
55
+
56
+
57
+ def get_gpu_memory():
58
+ return torch.cuda.memory_allocated() / 1024 / 1024 # Convert to MiB
59
+
60
+
61
+ class TorchTracemalloc:
62
+ def __init__(self):
63
+ self.begin = 0
64
+ self.peak = 0
65
+
66
+ def __enter__(self):
67
+ torch.cuda.empty_cache()
68
+ torch.cuda.reset_peak_memory_stats()
69
+ torch.cuda.synchronize()
70
+ self.begin = get_gpu_memory()
71
+ return self
72
+
73
+ def __exit__(self, *exc):
74
+ torch.cuda.synchronize()
75
+ self.peak = torch.cuda.max_memory_allocated() / 1024 / 1024
76
+
77
+ def consumed(self):
78
+ return self.peak - self.begin
79
+
80
+
81
+ def load_model_and_tokenizer():
82
+ model_name = "NousResearch/Meta-Llama-3-8B-Instruct"
83
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
84
+ special_tokens = {"pad_token": "<PAD>"}
85
+ tokenizer.add_special_tokens(special_tokens)
86
+ config = AutoConfig.from_pretrained(model_name)
87
+ setattr(
88
+ config, "quantizer_path", ".codebooks/llama-3-8b-instruct_1bit.xmad"
89
+ )
90
+ setattr(config, "window_length", 32)
91
+ # model = AutoModelForCausalLM.from_pretrained(
92
+ # model_name, config=config, torch_dtype=torch.float16
93
+ # ).to(device)
94
+ model = AutoModelForCausalLM.from_pretrained(
95
+ model_name, config=config, torch_dtype=torch.float16, device_map="auto"
96
+ )
97
+
98
+ print(f"Quantizer path in model config: {model.config.quantizer_path}")
99
+ logging.info(f"Quantizer path in model config: {model.config.quantizer_path}")
100
+
101
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
102
+ print(
103
+ "WARNING: Resizing the embedding matrix to match the tokenizer vocab size."
104
+ )
105
+ model.resize_token_embeddings(len(tokenizer))
106
+ tokenizer.padding_side = "left"
107
+ model.config.pad_token_id = tokenizer.pad_token_id
108
+
109
+ return model, tokenizer
110
+
111
+
112
+ model, tokenizer = load_model_and_tokenizer()
113
+
114
+
115
+ def process_dialog(message, history):
116
+ terminators = [
117
+ tokenizer.eos_token_id,
118
+ tokenizer.convert_tokens_to_ids("<|eot_id|>"),
119
+ ]
120
+
121
+ dialog = [
122
+ {"role": "user" if i % 2 == 0 else "assistant", "content": msg}
123
+ for i, (msg, _) in enumerate(history)
124
+ ]
125
+ dialog.append({"role": "user", "content": message})
126
+
127
+ prompt = tokenizer.apply_chat_template(
128
+ dialog, tokenize=False, add_generation_prompt=True
129
+ )
130
+ tokenized_input_prompt_ids = tokenizer(
131
+ prompt, return_tensors="pt"
132
+ ).input_ids.to(model.device)
133
+
134
+ start_time = time.time()
135
+
136
+ with TorchTracemalloc() as tracemalloc:
137
+ with torch.no_grad():
138
+ output = model.generate(
139
+ tokenized_input_prompt_ids,
140
+ # max_new_tokens=512,
141
+ temperature=0.4,
142
+ do_sample=True,
143
+ eos_token_id=terminators,
144
+ pad_token_id=tokenizer.pad_token_id,
145
+ )
146
+
147
+ end_time = time.time()
148
+
149
+ response = output[0][tokenized_input_prompt_ids.shape[-1] :]
150
+ cleaned_response = tokenizer.decode(
151
+ response,
152
+ skip_special_tokens=True,
153
+ clean_up_tokenization_spaces=True,
154
+ )
155
+
156
+ generation_time = end_time - start_time
157
+ gpu_memory = tracemalloc.consumed()
158
+
159
+ return cleaned_response, generation_time, gpu_memory
160
+
161
+ def chatbot_response(message, history):
162
+ response, generation_time, gpu_memory = process_dialog(message, history)
163
+
164
+ metrics = f"\n\n---\n\n **Metrics**\t*Answer Generation Time:* `{generation_time:.2f} sec`\t*GPU Memory Consumption:* `{gpu_memory:.2f} MiB`\n\n"
165
+ return response + metrics
166
+
167
+
168
+ demo = gr.ChatInterface(
169
+ fn=chatbot_response,
170
+ examples=["Hello", "How are you?", "Tell me a joke"],
171
+ title="Chat with xMAD's: 1-bit-Llama-3-8B-Instruct Model",
172
+ description="Contact support@xmad.ai to set up a demo",
173
+ )
174
+
175
+ if __name__ == "__main__":
176
+ username = os.getenv("AUTH_USERNAME")
177
+ password = os.getenv("AUTH_PASSWORD")
178
+ demo.launch(auth=(username, password))
179
+ # demo.launch()
backups/app_default_inf-api.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from huggingface_hub import InferenceClient
3
+
4
+ """
5
+ For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
6
+ """
7
+ client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
8
+
9
+
10
+ def respond(
11
+ message,
12
+ history: list[tuple[str, str]],
13
+ system_message,
14
+ max_tokens,
15
+ temperature,
16
+ top_p,
17
+ ):
18
+ messages = [{"role": "system", "content": system_message}]
19
+
20
+ for val in history:
21
+ if val[0]:
22
+ messages.append({"role": "user", "content": val[0]})
23
+ if val[1]:
24
+ messages.append({"role": "assistant", "content": val[1]})
25
+
26
+ messages.append({"role": "user", "content": message})
27
+
28
+ response = ""
29
+
30
+ for message in client.chat_completion(
31
+ messages,
32
+ max_tokens=max_tokens,
33
+ stream=True,
34
+ temperature=temperature,
35
+ top_p=top_p,
36
+ ):
37
+ token = message.choices[0].delta.content
38
+
39
+ response += token
40
+ yield response
41
+
42
+ """
43
+ For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
44
+ """
45
+ demo = gr.ChatInterface(
46
+ respond,
47
+ additional_inputs=[
48
+ gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
49
+ gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
50
+ gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
51
+ gr.Slider(
52
+ minimum=0.1,
53
+ maximum=1.0,
54
+ value=0.95,
55
+ step=0.05,
56
+ label="Top-p (nucleus sampling)",
57
+ ),
58
+ ],
59
+ )
60
+
61
+
62
+ if __name__ == "__main__":
63
+ demo.launch()
backups/app_local copy.py ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import platform
3
+ import sys
4
+ import time
5
+
6
+ import gradio as gr
7
+ import torch
8
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
9
+
10
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
11
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
12
+ # device = "cuda"
13
+
14
+ has_gpu = torch.cuda.is_available()
15
+ device = "cuda" if has_gpu else "cpu"
16
+
17
+ print(f"Python Platform: {platform.platform()}")
18
+ print(f"Python Version: {sys.version}")
19
+ print(f"PyTorch Version: {torch.__version__}")
20
+ print("GPU Availability:", "Available" if has_gpu else "Not Available")
21
+ print(f"Target Device: {device}")
22
+
23
+ if has_gpu:
24
+ print(f"GPU Type: {torch.cuda.get_device_name(0)}")
25
+ print(f"CUDA Version: {torch.version.cuda}")
26
+ else:
27
+ print("CUDA is not available.")
28
+
29
+
30
+ def get_gpu_memory():
31
+ return torch.cuda.memory_allocated() / 1024 / 1024 # Convert to MiB
32
+
33
+
34
+ class TorchTracemalloc:
35
+ def __init__(self):
36
+ self.begin = 0
37
+ self.peak = 0
38
+
39
+ def __enter__(self):
40
+ torch.cuda.empty_cache()
41
+ torch.cuda.reset_peak_memory_stats()
42
+ torch.cuda.synchronize()
43
+ self.begin = get_gpu_memory()
44
+ return self
45
+
46
+ def __exit__(self, *exc):
47
+ torch.cuda.synchronize()
48
+ self.peak = torch.cuda.max_memory_allocated() / 1024 / 1024
49
+
50
+ def consumed(self):
51
+ return self.peak - self.begin
52
+
53
+
54
+ def load_model_and_tokenizer():
55
+ model_name = "NousResearch/Meta-Llama-3-8B-Instruct"
56
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
57
+ special_tokens = {"pad_token": "<PAD>"}
58
+ tokenizer.add_special_tokens(special_tokens)
59
+ config = AutoConfig.from_pretrained(model_name)
60
+ setattr(
61
+ config, "quantizer_path", "codebooks/llama-3-8b-instruct_1bit.xmad"
62
+ )
63
+ setattr(config, "window_length", 32)
64
+ model = AutoModelForCausalLM.from_pretrained(
65
+ model_name, config=config, torch_dtype=torch.float16
66
+ ).to(device)
67
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
68
+ print(
69
+ "WARNING: Resizing the embedding matrix to match the tokenizer vocab size."
70
+ )
71
+ model.resize_token_embeddings(len(tokenizer))
72
+ tokenizer.padding_side = "left"
73
+ model.config.pad_token_id = tokenizer.pad_token_id
74
+
75
+ return model, tokenizer
76
+
77
+
78
+ model, tokenizer = load_model_and_tokenizer()
79
+
80
+
81
+ def process_dialog(message, history):
82
+ terminators = [
83
+ tokenizer.eos_token_id,
84
+ tokenizer.convert_tokens_to_ids("<|eot_id|>"),
85
+ ]
86
+
87
+ dialog = [
88
+ {"role": "user" if i % 2 == 0 else "assistant", "content": msg}
89
+ for i, (msg, _) in enumerate(history)
90
+ ]
91
+ dialog.append({"role": "user", "content": message})
92
+
93
+ prompt = tokenizer.apply_chat_template(
94
+ dialog, tokenize=False, add_generation_prompt=True
95
+ )
96
+ tokenized_input_prompt_ids = tokenizer(
97
+ prompt, return_tensors="pt"
98
+ ).input_ids.to(model.device)
99
+
100
+ start_time = time.time()
101
+
102
+ with TorchTracemalloc() as tracemalloc:
103
+ with torch.no_grad():
104
+ output = model.generate(
105
+ tokenized_input_prompt_ids,
106
+ # max_new_tokens=512,
107
+ temperature=0.4,
108
+ do_sample=True,
109
+ eos_token_id=terminators,
110
+ pad_token_id=tokenizer.pad_token_id,
111
+ )
112
+
113
+ end_time = time.time()
114
+
115
+ response = output[0][tokenized_input_prompt_ids.shape[-1] :]
116
+ cleaned_response = tokenizer.decode(
117
+ response,
118
+ skip_special_tokens=True,
119
+ clean_up_tokenization_spaces=True,
120
+ )
121
+
122
+ generation_time = end_time - start_time
123
+ gpu_memory = tracemalloc.consumed()
124
+
125
+ return cleaned_response, generation_time, gpu_memory
126
+
127
+ def chatbot_response(message, history):
128
+ response, generation_time, gpu_memory = process_dialog(message, history)
129
+ metrics = f"\n\n**Answer Generation Time:** {generation_time:.2f}sec\n**GPU Memory Consumption:** {gpu_memory:.2f}MiB\n\n---\n\n"
130
+ return response + metrics
131
+
132
+
133
+ demo = gr.ChatInterface(
134
+ fn=chatbot_response,
135
+ examples=["Hello", "How are you?", "Tell me a joke"],
136
+ title="Chat with xMAD's: 1-bit-Llama-3-8B-Instruct Model (size: 33 MB)",
137
+ description="Contact support@xmad.ai to set up a demo",
138
+ )
139
+
140
+ if __name__ == "__main__":
141
+ demo.launch(share=True)
142
+
backups/app_local_not_working.py ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import platform
3
+ import sys
4
+ import time
5
+
6
+ import gradio as gr
7
+ import torch
8
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
9
+
10
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
11
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
12
+ # device = "cuda"
13
+
14
+ has_gpu = torch.cuda.is_available()
15
+ device = "cuda" if has_gpu else "cpu"
16
+
17
+ print(f"Python Platform: {platform.platform()}")
18
+ print(f"Python Version: {sys.version}")
19
+ print(f"PyTorch Version: {torch.__version__}")
20
+ print("GPU Availability:", "Available" if has_gpu else "Not Available")
21
+ print(f"Target Device: {device}")
22
+
23
+ if has_gpu:
24
+ print(f"GPU Type: {torch.cuda.get_device_name(0)}")
25
+ print(f"CUDA Version: {torch.version.cuda}")
26
+ else:
27
+ print("CUDA is not available.")
28
+
29
+
30
+ def get_gpu_memory():
31
+ return torch.cuda.memory_allocated() / 1024 / 1024 # Convert to MiB
32
+
33
+
34
+ class TorchTracemalloc:
35
+ def __init__(self):
36
+ self.begin = 0
37
+ self.peak = 0
38
+
39
+ def __enter__(self):
40
+ torch.cuda.empty_cache()
41
+ torch.cuda.reset_peak_memory_stats()
42
+ torch.cuda.synchronize()
43
+ self.begin = get_gpu_memory()
44
+ return self
45
+
46
+ def __exit__(self, *exc):
47
+ torch.cuda.synchronize()
48
+ self.peak = torch.cuda.max_memory_allocated() / 1024 / 1024
49
+
50
+ def consumed(self):
51
+ return self.peak - self.begin
52
+
53
+
54
+ def load_model_and_tokenizer():
55
+ model_name = "NousResearch/Meta-Llama-3-8B-Instruct"
56
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
57
+ special_tokens = {"pad_token": "<PAD>"}
58
+ tokenizer.add_special_tokens(special_tokens)
59
+ config = AutoConfig.from_pretrained(model_name)
60
+ setattr(
61
+ config, "quantizer_path", "codebooks/llama-3-8b-instruct_1bit.xmad"
62
+ )
63
+ setattr(config, "window_length", 32)
64
+ model = AutoModelForCausalLM.from_pretrained(
65
+ model_name, config=config, torch_dtype=torch.float16
66
+ ).to(device)
67
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
68
+ print(
69
+ "WARNING: Resizing the embedding matrix to match the tokenizer vocab size."
70
+ )
71
+ model.resize_token_embeddings(len(tokenizer))
72
+ tokenizer.padding_side = "left"
73
+ model.config.pad_token_id = tokenizer.pad_token_id
74
+ model.config.eos_token_id = tokenizer.eos_token_id
75
+
76
+ return model, tokenizer
77
+
78
+
79
+ model, tokenizer = load_model_and_tokenizer()
80
+
81
+
82
+ def process_dialog(message, history):
83
+ terminators = [
84
+ tokenizer.eos_token_id,
85
+ tokenizer.convert_tokens_to_ids(""),
86
+ ]
87
+
88
+ dialog = [
89
+ {"role": "user" if i % 2 == 0 else "assistant", "content": msg}
90
+ for i, (msg, _) in enumerate(history)
91
+ ]
92
+ dialog.append({"role": "user", "content": message})
93
+
94
+ prompt = tokenizer.apply_chat_template(
95
+ dialog, tokenize=False, add_generation_prompt=True
96
+ )
97
+ tokenized_input_prompt_ids = tokenizer(
98
+ prompt, return_tensors="pt"
99
+ ).input_ids.to(model.device)
100
+
101
+ start_time = time.time()
102
+
103
+ with TorchTracemalloc() as tracemalloc:
104
+ with torch.no_grad():
105
+ output = model.generate(
106
+ tokenized_input_prompt_ids,
107
+ # max_new_tokens=512,
108
+ temperature=0.4,
109
+ do_sample=True,
110
+ eos_token_id=terminators[0], # Ensure eos_token_id is set
111
+ pad_token_id=tokenizer.pad_token_id,
112
+ )
113
+
114
+ end_time = time.time()
115
+
116
+ response = output[0][tokenized_input_prompt_ids.shape[-1] :]
117
+ cleaned_response = tokenizer.decode(
118
+ response,
119
+ skip_special_tokens=True,
120
+ clean_up_tokenization_spaces=True,
121
+ )
122
+
123
+ generation_time = end_time - start_time
124
+ gpu_memory = tracemalloc.consumed()
125
+
126
+ return cleaned_response, generation_time, gpu_memory
127
+
128
+ def chatbot_response(message, history, gen_time, gpu_mem):
129
+ response, generation_time, gpu_memory = process_dialog(message, history)
130
+ gen_time.append(generation_time)
131
+ gpu_mem.append(gpu_memory)
132
+ metrics = f"\n\n**Answer Generation Time:** {generation_time:.2f}sec\n**GPU Memory Consumption:** {gpu_memory:.2f}MiB\n\n---\n\n"
133
+ return response + metrics, gen_time, gpu_mem
134
+
135
+ with gr.Blocks(css="""
136
+ .full-page {width: 80vw; height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center;}
137
+ .custom-title {font-size: 24px; color: #333; font-weight: bold;}
138
+ """) as demo:
139
+ with gr.Column(elem_classes="full-page"):
140
+ gr.HTML("<div class='custom-title'>Chat with xMAD's: 1-bit-Llama-3-8B-Instruct Model (size: 33 MB)</div>")
141
+ gr.HTML("<p>Contact support@xmad.ai to set up a demo</p>")
142
+
143
+ gen_time = gr.State([])
144
+ gpu_mem = gr.State([])
145
+
146
+ chat_interface = gr.ChatInterface(
147
+ fn=chatbot_response,
148
+ examples=[["Hello"], ["How are you?"], ["Tell me a joke"]],
149
+ additional_inputs=[gen_time, gpu_mem]
150
+ )
151
+
152
+ with gr.Row():
153
+ gr.Markdown("## GPU Metrics")
154
+ metrics_display = gr.Markdown("")
155
+
156
+ def update_metrics(gen_time, gpu_mem):
157
+ if gen_time and gpu_mem: # Check if the lists are not empty
158
+ metrics_text = f"**Latest Generation Time:** {gen_time[-1]:.2f} sec\n**Latest GPU Memory Consumption:** {gpu_mem[-1]:.2f} MiB"
159
+ else:
160
+ metrics_text = "No metrics available yet."
161
+ return metrics_text
162
+
163
+ metrics_display.change(fn=update_metrics, inputs=[gen_time, gpu_mem], outputs=metrics_display)
164
+
165
+ demo.launch()
backups/app_local_not_working_2.py ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import platform
3
+ import sys
4
+ import time
5
+
6
+ import gradio as gr
7
+ import torch
8
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
9
+
10
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
11
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
12
+
13
+ has_gpu = torch.cuda.is_available()
14
+ device = "cuda" if has_gpu else "cpu"
15
+
16
+ print(f"Python Platform: {platform.platform()}")
17
+ print(f"Python Version: {sys.version}")
18
+ print(f"PyTorch Version: {torch.__version__}")
19
+ print("GPU Availability:", "Available" if has_gpu else "Not Available")
20
+ print(f"Target Device: {device}")
21
+
22
+ if has_gpu:
23
+ print(f"GPU Type: {torch.cuda.get_device_name(0)}")
24
+ print(f"CUDA Version: {torch.version.cuda}")
25
+ else:
26
+ print("CUDA is not available.")
27
+
28
+
29
+ def get_gpu_memory():
30
+ return torch.cuda.memory_allocated() / 1024 / 1024 # Convert to MiB
31
+
32
+
33
+ class TorchTracemalloc:
34
+ def __init__(self):
35
+ self.begin = 0
36
+ self.peak = 0
37
+
38
+ def __enter__(self):
39
+ torch.cuda.empty_cache()
40
+ torch.cuda.reset_peak_memory_stats()
41
+ torch.cuda.synchronize()
42
+ self.begin = get_gpu_memory()
43
+ return self
44
+
45
+ def __exit__(self, *exc):
46
+ torch.cuda.synchronize()
47
+ self.peak = torch.cuda.max_memory_allocated() / 1024 / 1024
48
+
49
+ def consumed(self):
50
+ return self.peak - self.begin
51
+
52
+
53
+ def load_model_and_tokenizer():
54
+ model_name = "NousResearch/Meta-Llama-3-8B-Instruct"
55
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
56
+ special_tokens = {"pad_token": "<PAD>"}
57
+ tokenizer.add_special_tokens(special_tokens)
58
+ config = AutoConfig.from_pretrained(model_name)
59
+ setattr(
60
+ config, "quantizer_path", "codebooks/llama-3-8b-instruct_1bit.xmad"
61
+ )
62
+ setattr(config, "window_length", 32)
63
+ model = AutoModelForCausalLM.from_pretrained(
64
+ model_name, config=config, torch_dtype=torch.float16
65
+ ).to(device)
66
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
67
+ print(
68
+ "WARNING: Resizing the embedding matrix to match the tokenizer vocab size."
69
+ )
70
+ model.resize_token_embeddings(len(tokenizer))
71
+ tokenizer.padding_side = "left"
72
+ model.config.pad_token_id = tokenizer.pad_token_id
73
+
74
+ return model, tokenizer
75
+
76
+
77
+ model, tokenizer = load_model_and_tokenizer()
78
+
79
+
80
+ def process_dialog(message, history):
81
+ terminators = [
82
+ tokenizer.eos_token_id,
83
+ tokenizer.convert_tokens_to_ids("<|eot_id|>"),
84
+ ]
85
+
86
+ dialog = [
87
+ {"role": "user" if i % 2 == 0 else "assistant", "content": msg}
88
+ for i, (msg, _) in enumerate(history)
89
+ ]
90
+ dialog.append({"role": "user", "content": message})
91
+
92
+ prompt = tokenizer.apply_chat_template(
93
+ dialog, tokenize=False, add_generation_prompt=True
94
+ )
95
+ tokenized_input_prompt_ids = tokenizer(
96
+ prompt, return_tensors="pt"
97
+ ).input_ids.to(model.device)
98
+
99
+ start_time = time.time()
100
+
101
+ with TorchTracemalloc() as tracemalloc:
102
+ with torch.no_grad():
103
+ output = model.generate(
104
+ tokenized_input_prompt_ids,
105
+ # max_new_tokens=512,
106
+ temperature=0.4,
107
+ do_sample=True,
108
+ eos_token_id=terminators,
109
+ pad_token_id=tokenizer.pad_token_id,
110
+ )
111
+
112
+ end_time = time.time()
113
+
114
+ response = output[0][tokenized_input_prompt_ids.shape[-1] :]
115
+ cleaned_response = tokenizer.decode(
116
+ response,
117
+ skip_special_tokens=True,
118
+ clean_up_tokenization_spaces=True,
119
+ )
120
+
121
+ generation_time = end_time - start_time
122
+ gpu_memory = tracemalloc.consumed()
123
+
124
+ return cleaned_response, generation_time, gpu_memory
125
+
126
+ def chatbot_response(message, history):
127
+ response, generation_time, gpu_memory = process_dialog(message, history)
128
+ metrics = f"\n\n**Answer Generation Time:** {generation_time:.2f}sec\n**GPU Memory Consumption:** {gpu_memory:.2f}MiB\n\n---\n\n"
129
+ return response + metrics
130
+
131
+ with gr.Blocks(css="""
132
+ .full-page {width: 80vw; height: 90vh; display: flex; flex-direction: column; justify-content: center; align-items: center;}
133
+ .custom-title {font-size: 24px; color: #333; font-weight: bold;}
134
+ """) as demo:
135
+ with gr.Column(elem_classes="full-page"):
136
+ gr.HTML("<div class='custom-title'>Chat with xMAD's: 1-bit-Llama-3-8B-Instruct Model (size: 33 MB)</div>")
137
+ gr.HTML("<p>Contact support@xmad.ai to set up a demo</p>")
138
+
139
+ chat_interface = gr.ChatInterface(
140
+ fn=chatbot_response,
141
+ examples=["Hello", "How are you?", "Tell me a joke"],
142
+ )
143
+
144
+ with gr.Row():
145
+ gr.Markdown("## Another Section")
146
+ # Add more components to this section
147
+ gr.Textbox(label="Input")
148
+ gr.Button("Submit")
149
+
150
+ demo.launch()
backups/app_v0.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import torch
3
+ import gradio as gr
4
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
5
+ from huggingface_hub import InferenceClient
6
+
7
+ # Environment variables
8
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
9
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
10
+ # os.environ["GRADIO_CACHE_DIR"] = "/home/jwy4/gradio_cache"
11
+
12
+ # Initialize Hugging Face Inference Client
13
+ client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
14
+
15
+ # Load model and tokenizer (if you want to use a local model, uncomment and use the load_model_and_tokenizer function)
16
+ model = None
17
+ tokenizer = None
18
+
19
+ def load_model_and_tokenizer(model_name, dtype, kv_bits):
20
+ global model, tokenizer
21
+ if model is None or tokenizer is None:
22
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
23
+ special_tokens = {"pad_token": "<PAD>"}
24
+ tokenizer.add_special_tokens(special_tokens)
25
+
26
+ config = AutoConfig.from_pretrained(model_name)
27
+ if kv_bits != "unquantized":
28
+ quantizer_path = f"codebooks/{model_name.split('/')[-1]}_{kv_bits}bit.xmad"
29
+ setattr(config, "quantizer_path", quantizer_path)
30
+
31
+ dtype = torch.__dict__.get(dtype, torch.float32)
32
+ model = AutoModelForCausalLM.from_pretrained(model_name, config=config, torch_dtype=dtype, device_map="auto")
33
+
34
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
35
+ model.resize_token_embeddings(len(tokenizer))
36
+
37
+ tokenizer.padding_side = "left"
38
+ model.config.pad_token_id = tokenizer.pad_token_id
39
+
40
+ return model, tokenizer
41
+
42
+ def respond(message, history, system_message, max_tokens, temperature, top_p):
43
+ messages = [{"role": "system", "content": system_message}]
44
+ for val in history:
45
+ if val[0]:
46
+ messages.append({"role": "user", "content": val[0]})
47
+ if val[1]:
48
+ messages.append({"role": "assistant", "content": val[1]})
49
+ messages.append({"role": "user", "content": message})
50
+
51
+ response = ""
52
+ for message in client.chat_completion(
53
+ messages,
54
+ max_tokens=max_tokens,
55
+ stream=True,
56
+ temperature=temperature,
57
+ top_p=top_p,
58
+ ):
59
+ token = message.choices[0].delta.content
60
+ response += token
61
+ yield response
62
+
63
+ # Initialize Gradio ChatInterface
64
+ demo = gr.ChatInterface(
65
+ respond,
66
+ additional_inputs=[
67
+ gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
68
+ gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
69
+ gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
70
+ gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
71
+ ],
72
+ theme="default",
73
+ title="1bit llama3 by xMAD.ai",
74
+ description="The first industrial level 1 bit quantization Llama3, we can achieve 800 tokens per second on NVIDIA V100 adn 1200 on NVIDIA A100, 90%% cost down of your cloud hostin cost",
75
+ css=".scrollable { height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ccc; }"
76
+ )
77
+
78
+ if __name__ == "__main__":
79
+ # Uncomment if using local model loading
80
+ # load_model_and_tokenizer("NousResearch/Meta-Llama-3-8B-Instruct", "fp16", "1")
81
+ demo.launch()
backups/app_v1.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import torch
3
+ import gradio as gr
4
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
5
+
6
+ # Environment variables
7
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
8
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
9
+
10
+ # Global variables for model and tokenizer
11
+ model = None
12
+ tokenizer = None
13
+
14
+ def get_gpu_memory():
15
+ return torch.cuda.memory_allocated() / 1024 / 1024 # Convert to MiB
16
+
17
+ class TorchTracemalloc:
18
+ def __init__(self):
19
+ self.begin = 0
20
+ self.peak = 0
21
+
22
+ def __enter__(self):
23
+ torch.cuda.empty_cache()
24
+ torch.cuda.reset_peak_memory_stats()
25
+ torch.cuda.synchronize()
26
+ self.begin = get_gpu_memory()
27
+ return self
28
+
29
+ def __exit__(self, *exc):
30
+ torch.cuda.synchronize()
31
+ self.peak = (
32
+ torch.cuda.max_memory_allocated() / 1024 / 1024
33
+ ) # Convert to MiB
34
+
35
+ def consumed(self):
36
+ return self.peak - self.begin
37
+
38
+ def load_model_and_tokenizer(model_name, dtype, kv_bits):
39
+ global model, tokenizer
40
+ if model is None or tokenizer is None:
41
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
42
+ special_tokens = {"pad_token": "<PAD>"}
43
+ tokenizer.add_special_tokens(special_tokens)
44
+
45
+ config = AutoConfig.from_pretrained(model_name)
46
+ if kv_bits != "unquantized":
47
+ quantizer_path = f"codebooks/{model_name.split('/')[-1]}_{kv_bits}bit.xmad"
48
+ setattr(config, "quantizer_path", quantizer_path)
49
+
50
+ dtype = torch.__dict__.get(dtype, torch.float32)
51
+ model = AutoModelForCausalLM.from_pretrained(model_name, config=config, torch_dtype=dtype, device_map="auto")
52
+
53
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
54
+ model.resize_token_embeddings(len(tokenizer))
55
+
56
+ tokenizer.padding_side = "left"
57
+ model.config.pad_token_id = tokenizer.pad_token_id
58
+
59
+ return model, tokenizer
60
+
61
+ # Initialize model and tokenizer
62
+ model, tokenizer = load_model_and_tokenizer("NousResearch/Hermes-2-Theta-Llama-3-8B", "fp16", "1")
63
+
64
+ def process_dialog(dialog, model, tokenizer, max_tokens, temperature):
65
+ prompt = tokenizer.apply_chat_template(
66
+ dialog, tokenize=False, add_generation_prompt=True
67
+ )
68
+ tokenized_input_prompt_ids = tokenizer(
69
+ prompt, return_tensors="pt"
70
+ ).input_ids.to(model.device)
71
+
72
+ torch.cuda.empty_cache()
73
+ torch.cuda.reset_peak_memory_stats()
74
+
75
+ with TorchTracemalloc() as tt:
76
+ start_time = time.time()
77
+ with torch.no_grad():
78
+ token_ids_for_each_answer = model.generate(
79
+ tokenized_input_prompt_ids,
80
+ max_new_tokens=max_tokens,
81
+ temperature=temperature,
82
+ do_sample=True,
83
+ eos_token_id=tokenizer.eos_token_id,
84
+ pad_token_id=tokenizer.pad_token_id,
85
+ )
86
+ torch.cuda.synchronize()
87
+ end_time = time.time()
88
+
89
+ response = token_ids_for_each_answer[0][
90
+ tokenized_input_prompt_ids.shape[-1] :
91
+ ]
92
+ cleaned_response = tokenizer.decode(
93
+ response,
94
+ skip_special_tokens=True,
95
+ clean_up_tokenization_spaces=True,
96
+ )
97
+
98
+ return cleaned_response
99
+
100
+ def respond(message, history, system_message, max_tokens, temperature):
101
+ dialog = [{"role": "system", "content": system_message}]
102
+ for val in history:
103
+ if val[0]:
104
+ dialog.append({"role": "user", "content": val[0]})
105
+ if val[1]:
106
+ dialog.append({"role": "assistant", "content": val[1]})
107
+ dialog.append({"role": "user", "content": message})
108
+
109
+ response = process_dialog(dialog, model, tokenizer, max_tokens, temperature)
110
+ history.append((message, response))
111
+ return history, history
112
+
113
+ # Initialize Gradio ChatInterface
114
+ demo = gr.ChatInterface(
115
+ fn=respond,
116
+ additional_inputs=[
117
+ gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
118
+ gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
119
+ gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
120
+ ],
121
+ theme="default",
122
+ title="1bit llama3 by xMAD.ai",
123
+ description="The first industrial level 1 bit quantization Llama3, we can achieve 800 tokens per second on NVIDIA V100 and 1200 on NVIDIA A100, 90% cost down of your cloud hosting cost",
124
+ css=".scrollable { height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ccc; }"
125
+ )
126
+
127
+ if __name__ == "__main__":
128
+ demo.launch()
backups/app_v1_faster.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import time
4
+
5
+ import gradio as gr
6
+ import torch
7
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
8
+
9
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
10
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
11
+
12
+
13
+ def get_gpu_memory():
14
+ return torch.cuda.memory_allocated() / 1024 / 1024 # Convert to MiB
15
+
16
+
17
+ class TorchTracemalloc:
18
+ def __init__(self):
19
+ self.begin = 0
20
+ self.peak = 0
21
+
22
+ def __enter__(self):
23
+ torch.cuda.empty_cache()
24
+ torch.cuda.reset_peak_memory_stats()
25
+ torch.cuda.synchronize()
26
+ self.begin = get_gpu_memory()
27
+ return self
28
+
29
+ def __exit__(self, *exc):
30
+ torch.cuda.synchronize()
31
+ self.peak = (
32
+ torch.cuda.max_memory_allocated() / 1024 / 1024
33
+ ) # Convert to MiB
34
+
35
+ def consumed(self):
36
+ return self.peak - self.begin
37
+
38
+
39
+ def load_model_and_tokenizer():
40
+ model_name = "NousResearch/Hermes-2-Theta-Llama-3-8B"
41
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
42
+ special_tokens = {"pad_token": "<PAD>"}
43
+ tokenizer.add_special_tokens(special_tokens)
44
+ config = AutoConfig.from_pretrained(model_name)
45
+ setattr(
46
+ config,
47
+ "quantizer_path",
48
+ f"codebooks/Hermes-2-Theta-Llama-3-8B_1bit.xmad",
49
+ )
50
+ setattr(config, "window_length", 32)
51
+ model = AutoModelForCausalLM.from_pretrained(
52
+ model_name, config=config, torch_dtype=torch.float16, device_map="cuda:2"
53
+ )
54
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
55
+ print(
56
+ "WARNING: Resizing the embedding matrix to match the tokenizer vocab size."
57
+ )
58
+ model.resize_token_embeddings(len(tokenizer))
59
+ model.config.pad_token_id = tokenizer.pad_token_id
60
+ return model, tokenizer
61
+
62
+
63
+ def process_dialog(dialog, model, tokenizer):
64
+ prompt = tokenizer.apply_chat_template(
65
+ dialog, tokenize=False, add_generation_prompt=True
66
+ )
67
+ tokenized_input_prompt_ids = tokenizer(
68
+ prompt, return_tensors="pt"
69
+ ).input_ids.to(model.device)
70
+
71
+ torch.cuda.empty_cache()
72
+ torch.cuda.reset_peak_memory_stats()
73
+
74
+ with TorchTracemalloc() as tt:
75
+ start_time = time.time()
76
+ with torch.no_grad():
77
+ token_ids_for_each_answer = model.generate(
78
+ tokenized_input_prompt_ids,
79
+ max_new_tokens=512,
80
+ temperature=0.7,
81
+ do_sample=True,
82
+ eos_token_id=tokenizer.eos_token_id,
83
+ pad_token_id=tokenizer.pad_token_id,
84
+ )
85
+ torch.cuda.synchronize()
86
+ end_time = time.time()
87
+
88
+ response = token_ids_for_each_answer[0][
89
+ tokenized_input_prompt_ids.shape[-1] :
90
+ ]
91
+ cleaned_response = tokenizer.decode(
92
+ response,
93
+ skip_special_tokens=True,
94
+ clean_up_tokenization_spaces=True,
95
+ )
96
+
97
+ return cleaned_response
98
+
99
+
100
+ model, tokenizer = load_model_and_tokenizer()
101
+
102
+
103
+ def chatbot_interface(user_input, chat_history):
104
+ dialog = [{"role": "user", "content": user_input}]
105
+ response = process_dialog(dialog, model, tokenizer)
106
+ chat_history.append((user_input, response))
107
+ return chat_history, chat_history
108
+
109
+
110
+ def main():
111
+ with gr.Blocks() as demo:
112
+ chatbot = gr.Chatbot()
113
+ user_input = gr.Textbox(placeholder="Type your message here...")
114
+ clear = gr.Button("Clear")
115
+
116
+ user_input.submit(chatbot_interface, [user_input, chatbot], [chatbot, chatbot])
117
+ clear.click(lambda: None, None, chatbot)
118
+
119
+ demo.launch()
120
+
121
+
122
+ if __name__ == "__main__":
123
+ main()
backups/app_v2_enabled_streaming.py ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import torch
3
+ import gradio as gr
4
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
5
+
6
+ # Environment variables
7
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
8
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
9
+ os.environ["CUDA_LAUNCH_BLOCKING"] = "1" # Enable synchronous CUDA operations
10
+
11
+ # Load model and tokenizer
12
+ model = None
13
+ tokenizer = None
14
+
15
+ def load_model_and_tokenizer(model_name, dtype, kv_bits):
16
+ global model, tokenizer
17
+ if model is None or tokenizer is None:
18
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
19
+ special_tokens = {"pad_token": "<PAD>"}
20
+ tokenizer.add_special_tokens(special_tokens)
21
+
22
+ config = AutoConfig.from_pretrained(model_name)
23
+ if kv_bits != "unquantized":
24
+ quantizer_path = f"codebooks/{model_name.split('/')[-1]}_{kv_bits}bit.xmad"
25
+ setattr(config, "quantizer_path", quantizer_path)
26
+
27
+ dtype = torch.__dict__.get(dtype, torch.float32)
28
+ model = AutoModelForCausalLM.from_pretrained(model_name, config=config, torch_dtype=dtype, device_map="auto")
29
+
30
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
31
+ model.resize_token_embeddings(len(tokenizer))
32
+
33
+ tokenizer.padding_side = "left"
34
+ model.config.pad_token_id = tokenizer.pad_token_id
35
+
36
+ return model, tokenizer
37
+
38
+ # Initialize model and tokenizer
39
+ load_model_and_tokenizer("NousResearch/Hermes-2-Theta-Llama-3-8B", "fp16", "1")
40
+
41
+ def respond(message, history, system_message, max_tokens, temperature, top_p):
42
+ messages = [{"role": "system", "content": system_message}]
43
+ for val in history:
44
+ if val[0]:
45
+ messages.append({"role": "user", "content": val[0]})
46
+ if val[1]:
47
+ messages.append({"role": "assistant", "content": val[1]})
48
+ messages.append({"role": "user", "content": message})
49
+
50
+ # Prepare input prompt
51
+ prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
52
+ tokenized_input_prompt_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(model.device)
53
+
54
+ response = ""
55
+ try:
56
+ for _ in range(max_tokens):
57
+ with torch.no_grad():
58
+ output = model.generate(
59
+ tokenized_input_prompt_ids,
60
+ max_new_tokens=1,
61
+ temperature=temperature,
62
+ top_p=top_p,
63
+ do_sample=True,
64
+ eos_token_id=tokenizer.eos_token_id,
65
+ pad_token_id=tokenizer.pad_token_id,
66
+ return_dict_in_generate=True,
67
+ output_scores=True,
68
+ )
69
+ next_token_id = output.sequences[0, -1].unsqueeze(0).unsqueeze(0)
70
+
71
+ if next_token_id.item() >= len(tokenizer):
72
+ raise ValueError(f"Next token ID {next_token_id.item()} is out of bounds for vocab size {len(tokenizer)}")
73
+
74
+ tokenized_input_prompt_ids = torch.cat([tokenized_input_prompt_ids, next_token_id], dim=-1)
75
+ token = tokenizer.decode(next_token_id.squeeze().tolist(), skip_special_tokens=True)
76
+ response += token
77
+ yield response
78
+
79
+ if next_token_id == tokenizer.eos_token_id:
80
+ break
81
+ except Exception as e:
82
+ yield f"Error: {str(e)}"
83
+
84
+ # Initialize Gradio ChatInterface
85
+ demo = gr.ChatInterface(
86
+ respond,
87
+ additional_inputs=[
88
+ gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
89
+ gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
90
+ gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
91
+ gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
92
+ ],
93
+ theme="default",
94
+ title="1bit llama3 by xMAD.ai",
95
+ description="""
96
+ Welcome to the future of AI with xMAD.ai's 1bit Llama3, a breakthrough in Large Language Model (LLM) quantization and efficiency. Our cutting-edge technology offers:
97
+
98
+ 1. **Unmatched Speed**: Achieve an impressive 800 tokens per second on NVIDIA V100 and 1200 tokens per second on NVIDIA A100.
99
+ 2. **Cost Efficiency**: Slash your cloud hosting expenses by up to 90% with our highly optimized models, delivering significant savings for enterprises.
100
+ 3. **Scalability**: Support for up to 10x the number of concurrent users without compromising performance, ensuring seamless user experiences.
101
+ 4. **Memory Savings**: Experience 7x memory reduction, allowing you to run powerful LLMs on standard hardware.
102
+
103
+ Our Llama3 model is the first in the industry to achieve 1-bit quantization without any loss in model performance. This innovation enables businesses to deploy robust AI solutions locally or in the cloud with minimal overhead.
104
+
105
+ Explore the potential of Llama3 with our interactive demo, where you can see real-time text generation and understand how our technology can transform your operations. Whether you are looking to enhance your chatbot capabilities, streamline your operations, or cut down on AI deployment costs, xMAD.ai offers a solution that scales with your needs.
106
+
107
+ Join us in redefining AI efficiency and cost-effectiveness. Try the demo now and see the difference! For Enterprice Demo, reach out to support@xmad.ai !
108
+ """,
109
+ css=".scrollable { height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ccc; }"
110
+ )
111
+
112
+ if __name__ == "__main__":
113
+ demo.launch(share=False)
backups/app_v3.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import torch
3
+ import gradio as gr
4
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
5
+
6
+ # Environment variables
7
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
8
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
9
+ os.environ["CUDA_LAUNCH_BLOCKING"] = "1" # Enable synchronous CUDA operations
10
+
11
+ # Load model and tokenizer
12
+ model = None
13
+ tokenizer = None
14
+
15
+ def load_model_and_tokenizer(model_name, dtype, kv_bits):
16
+ global model, tokenizer
17
+ if model is None or tokenizer is None:
18
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
19
+ special_tokens = {"pad_token": "<PAD>"}
20
+ tokenizer.add_special_tokens(special_tokens)
21
+
22
+ config = AutoConfig.from_pretrained(model_name)
23
+ if kv_bits != "unquantized":
24
+ quantizer_path = os.path.join("codebooks", f"{model_name.split('/')[-1]}_{kv_bits}bit.xmad")
25
+ setattr(config, "quantizer_path", quantizer_path)
26
+
27
+ dtype = torch.__dict__.get(dtype, torch.float32)
28
+ model = AutoModelForCausalLM.from_pretrained(model_name, config=config, torch_dtype=dtype, device_map="auto")
29
+
30
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
31
+ model.resize_token_embeddings(len(tokenizer))
32
+
33
+ tokenizer.padding_side = "left"
34
+ model.config.pad_token_id = tokenizer.pad_token_id
35
+
36
+ return model, tokenizer
37
+
38
+ # Initialize model and tokenizer
39
+ load_model_and_tokenizer("NousResearch/Hermes-2-Theta-Llama-3-8B", "fp16", "1")
40
+
41
+ def respond(message, history, system_message, max_tokens, temperature, top_p):
42
+ messages = [{"role": "system", "content": system_message}]
43
+ for val in history:
44
+ if val[0]:
45
+ messages.append({"role": "user", "content": val[0]})
46
+ if val[1]:
47
+ messages.append({"role": "assistant", "content": val[1]})
48
+ messages.append({"role": "user", "content": message})
49
+
50
+ # Prepare input prompt
51
+ prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
52
+ tokenized_input_prompt_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(model.device)
53
+
54
+ response = ""
55
+ try:
56
+ with torch.no_grad():
57
+ while len(response.split()) < max_tokens:
58
+ output = model.generate(
59
+ tokenized_input_prompt_ids,
60
+ max_new_tokens=1,
61
+ temperature=temperature,
62
+ top_p=top_p,
63
+ do_sample=True,
64
+ eos_token_id=tokenizer.eos_token_id,
65
+ pad_token_id=tokenizer.pad_token_id,
66
+ return_dict_in_generate=True,
67
+ output_scores=True,
68
+ )
69
+ next_token_id = output.sequences[:, -1:]
70
+ tokenized_input_prompt_ids = torch.cat([tokenized_input_prompt_ids, next_token_id], dim=1)
71
+ token = tokenizer.decode(next_token_id[0], skip_special_tokens=True)
72
+ response += token
73
+ yield response
74
+
75
+ if tokenizer.eos_token_id in next_token_id:
76
+ break
77
+ except Exception as e:
78
+ yield f"Error: {str(e)}"
79
+
80
+ # Initialize Gradio ChatInterface
81
+ demo = gr.ChatInterface(
82
+ respond,
83
+ additional_inputs=[
84
+ gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
85
+ gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
86
+ gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
87
+ gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
88
+ ],
89
+ theme="default",
90
+ title="1bit Llama3 by xMAD.ai",
91
+ description="""
92
+ Welcome to the future of AI with xMAD.ai's 1bit Llama3, a breakthrough in Large Language Model (LLM) quantization and efficiency. Our cutting-edge technology offers:
93
+
94
+ 1. **Unmatched Speed**: Achieve an impressive 800 tokens per second on NVIDIA V100 and 1200 tokens per second on NVIDIA A100.
95
+ 2. **Cost Efficiency**: Slash your cloud hosting expenses by up to 90% with our highly optimized models, delivering significant savings for enterprises.
96
+ 3. **Scalability**: Support for up to 10x the number of concurrent users without compromising performance, ensuring seamless user experiences.
97
+ 4. **Memory Savings**: Experience 7x memory reduction, allowing you to run powerful LLMs on standard hardware.
98
+ 5. **Democratization of AI**: Make advanced LLMs accessible for various applications, from customer service to content creation, all while maintaining high accuracy and reliability.
99
+
100
+ Our Llama3 model is the first in the industry to achieve 1-bit quantization without any loss in model performance. This innovation enables businesses to deploy robust AI solutions locally or in the cloud with minimal overhead.
101
+
102
+ Explore the potential of Llama3 with our interactive demo, where you can see real-time text generation and understand how our technology can transform your operations. Whether you are looking to enhance your chatbot capabilities, streamline your operations, or cut down on AI deployment costs, xMAD.ai offers a solution that scales with your needs.
103
+
104
+ Join us in redefining AI efficiency and cost-effectiveness. Try the demo now and see the difference!
105
+ """,
106
+ css=".scrollable { height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ccc; }"
107
+ )
108
+
109
+ if __name__ == "__main__":
110
+ demo.launch(share=False)
backups/app_v4_fast.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+
4
+ import gradio as gr
5
+ import torch
6
+ from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
7
+
8
+ os.environ["TOKENIZERS_PARALLELISM"] = "0"
9
+ os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
10
+
11
+ def load_model_and_tokenizer():
12
+ model_name = "NousResearch/Hermes-2-Theta-Llama-3-8B"
13
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
14
+ special_tokens = {"pad_token": "<PAD>"}
15
+ tokenizer.add_special_tokens(special_tokens)
16
+ config = AutoConfig.from_pretrained(model_name)
17
+ setattr(
18
+ config,
19
+ "quantizer_path",
20
+ f"codebooks/Hermes-2-Theta-Llama-3-8B_1bit.xmad",
21
+ )
22
+ setattr(config, "window_length", 32)
23
+ model = AutoModelForCausalLM.from_pretrained(
24
+ model_name, config=config, torch_dtype=torch.float16, device_map="cuda:2"
25
+ )
26
+ if len(tokenizer) > model.get_input_embeddings().weight.shape[0]:
27
+ print(
28
+ "WARNING: Resizing the embedding matrix to match the tokenizer vocab size."
29
+ )
30
+ model.resize_token_embeddings(len(tokenizer))
31
+ model.config.pad_token_id = tokenizer.pad_token_id
32
+ return model, tokenizer
33
+
34
+ model, tokenizer = load_model_and_tokenizer()
35
+
36
+ def process_dialog(message, history):
37
+ dialog = [{"role": "user", "content": message}]
38
+ prompt = tokenizer.apply_chat_template(dialog, tokenize=False, add_generation_prompt=True)
39
+ tokenized_input_prompt_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(model.device)
40
+
41
+ with torch.no_grad():
42
+ token_ids_for_each_answer = model.generate(
43
+ tokenized_input_prompt_ids,
44
+ max_new_tokens=512,
45
+ temperature=0.7,
46
+ do_sample=True,
47
+ eos_token_id=tokenizer.eos_token_id,
48
+ pad_token_id=tokenizer.pad_token_id,
49
+ )
50
+
51
+ response = token_ids_for_each_answer[0][tokenized_input_prompt_ids.shape[-1]:]
52
+ cleaned_response = tokenizer.decode(
53
+ response,
54
+ skip_special_tokens=True,
55
+ clean_up_tokenization_spaces=True,
56
+ )
57
+
58
+ return cleaned_response
59
+
60
+ def chatbot_response(message, history):
61
+ response = process_dialog(message, history)
62
+ return response
63
+
64
+ demo = gr.ChatInterface(
65
+ fn=chatbot_response,
66
+ examples=["Hello", "How are you?", "Tell me a joke"],
67
+ title="LLM Chatbot",
68
+ description="A demo chatbot using a quantized LLaMA model.",
69
+ )
70
+
71
+ if __name__ == "__main__":
72
+ demo.launch()
benchmark_utils.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gc
2
+ import threading
3
+ import time
4
+
5
+ import psutil
6
+ import torch
7
+
8
+
9
+ class PeakCPUMemory:
10
+ def __init__(self):
11
+ self.process = psutil.Process()
12
+ self.peak_monitoring = False
13
+
14
+ def peak_monitor(self):
15
+ self.cpu_memory_peak = -1
16
+
17
+ while True:
18
+ self.cpu_memory_peak = max(
19
+ self.process.memory_info().rss, self.cpu_memory_peak
20
+ )
21
+
22
+ # can't sleep
23
+ if not self.peak_monitoring:
24
+ break
25
+
26
+ def start(self):
27
+ self.peak_monitoring = True
28
+ self.thread = threading.Thread(target=self.peak_monitor)
29
+ self.thread.daemon = True
30
+ self.thread.start()
31
+
32
+ def stop(self):
33
+ self.peak_monitoring = False
34
+ self.thread.join()
35
+ return self.cpu_memory_peak
36
+
37
+
38
+ cpu_peak_tracker = PeakCPUMemory()
39
+
40
+
41
+ def start_measure():
42
+ # Time
43
+ measures = {"time": time.time()}
44
+
45
+ gc.collect()
46
+ torch.cuda.empty_cache()
47
+
48
+ # CPU memory
49
+ measures["cpu"] = psutil.Process().memory_info().rss
50
+ cpu_peak_tracker.start()
51
+
52
+ # GPU memory
53
+ for i in range(torch.cuda.device_count()):
54
+ measures[str(i)] = torch.cuda.memory_allocated(i)
55
+ torch.cuda.reset_peak_memory_stats()
56
+
57
+ return measures
58
+
59
+
60
+ def end_measure(start_measures):
61
+ # Time
62
+ measures = {"time": time.time() - start_measures["time"]}
63
+
64
+ gc.collect()
65
+ torch.cuda.empty_cache()
66
+
67
+ # CPU memory
68
+ measures["cpu"] = (
69
+ psutil.Process().memory_info().rss - start_measures["cpu"]
70
+ ) / 2**20
71
+ measures["cpu-peak"] = (
72
+ cpu_peak_tracker.stop() - start_measures["cpu"]
73
+ ) / 2**20
74
+
75
+ # GPU memory
76
+ for i in range(torch.cuda.device_count()):
77
+ measures[str(i)] = (
78
+ torch.cuda.memory_allocated(i) - start_measures[str(i)]
79
+ ) / 2**20
80
+ measures[f"{i}-peak"] = (
81
+ torch.cuda.max_memory_allocated(i) - start_measures[str(i)]
82
+ ) / 2**20
83
+
84
+ return measures
85
+
86
+
87
+ def log_measures(measures, description):
88
+ print(f"{description}:")
89
+ print(f"- Time: {measures['time']:.2f}s")
90
+ for i in range(torch.cuda.device_count()):
91
+ print(f"- GPU {i} allocated: {measures[str(i)]:.2f}MiB")
92
+ peak = measures[f"{i}-peak"]
93
+ print(f"- GPU {i} peak: {peak:.2f}MiB")
94
+ print(f"- CPU RAM allocated: {measures['cpu']:.2f}MiB")
95
+ print(f"- CPU RAM peak: {measures['cpu-peak']:.2f}MiB")
chats.json ADDED
@@ -0,0 +1,1850 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ [
3
+ {
4
+ "role": "user",
5
+ "content": "What is the recipe of mayonnaise?"
6
+ }
7
+ ],
8
+ [
9
+ {
10
+ "role": "user",
11
+ "content": "I am going to Paris, what should I see?"
12
+ },
13
+ {
14
+ "role": "assistant",
15
+ "content": "Paris, the capital of France, is known for its stunning architecture, art museums, historical landmarks, and romantic atmosphere. Here are some of the top attractions to see in Paris:1. The Eiffel Tower: The iconic Eiffel Tower is one of the most recognizable landmarks in the world and offers breathtaking views of the city. 2. The Louvre Museum: The Louvre is one of the world's largest and most famous museums, housing an impressive collection of art and artifacts, including the Mona Lisa. 3. Notre-Dame Cathedral: This beautiful cathedral is one of the most famous landmarks in Paris and is known for its Gothic architecture and stunning stained glass windows.These are just a few of the many attractions that Paris has to offer. With so much to see and do, it's no wonder that Paris is one of the most popular tourist destinations in the world."
16
+ },
17
+ {
18
+ "role": "user",
19
+ "content": "What is so great about #1?"
20
+ }
21
+ ],
22
+ [
23
+ {
24
+ "role": "system",
25
+ "content": "Always answer with Haiku"
26
+ },
27
+ {
28
+ "role": "user",
29
+ "content": "I am going to Paris, what should I see?"
30
+ }
31
+ ],
32
+ [
33
+ {
34
+ "role": "system",
35
+ "content": "Always answer with emojis"
36
+ },
37
+ {
38
+ "role": "user",
39
+ "content": "How to go from Beijing to NY?"
40
+ }
41
+ ],
42
+ [
43
+ {
44
+ "role": "system",
45
+ "content": "You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature. If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information."
46
+ },
47
+ {
48
+ "role": "user",
49
+ "content": "Write a brief birthday message to John"
50
+ }
51
+ ],
52
+ [
53
+ {
54
+ "role": "user",
55
+ "content": "Explain the concept of quantum entanglement"
56
+ }
57
+ ],
58
+ [
59
+ {
60
+ "role": "system",
61
+ "content": "You are a pirate. Respond in pirate speak."
62
+ },
63
+ {
64
+ "role": "user",
65
+ "content": "How do I find buried treasure?"
66
+ }
67
+ ],
68
+ [
69
+ {
70
+ "role": "user",
71
+ "content": "What are the main causes of climate change?"
72
+ }
73
+ ],
74
+ [
75
+ {
76
+ "role": "system",
77
+ "content": "You are a famous chef. Give cooking advice."
78
+ },
79
+ {
80
+ "role": "user",
81
+ "content": "How do I make the perfect omelette?"
82
+ }
83
+ ],
84
+ [
85
+ {
86
+ "role": "user",
87
+ "content": "Explain the theory of relativity in simple terms"
88
+ }
89
+ ],
90
+ [
91
+ {
92
+ "role": "system",
93
+ "content": "You are a medieval knight. Speak accordingly."
94
+ },
95
+ {
96
+ "role": "user",
97
+ "content": "How do I defend a castle?"
98
+ }
99
+ ],
100
+ [
101
+ {
102
+ "role": "user",
103
+ "content": "What are the benefits of meditation?"
104
+ }
105
+ ],
106
+ [
107
+ {
108
+ "role": "system",
109
+ "content": "You are a standup comedian. Make your answers funny."
110
+ },
111
+ {
112
+ "role": "user",
113
+ "content": "Why did the chicken cross the road?"
114
+ }
115
+ ],
116
+ [
117
+ {
118
+ "role": "user",
119
+ "content": "How does blockchain technology work?"
120
+ }
121
+ ],
122
+ [
123
+ {
124
+ "role": "system",
125
+ "content": "You are a wise old tree. Speak with nature-inspired wisdom."
126
+ },
127
+ {
128
+ "role": "user",
129
+ "content": "How can I find my purpose in life?"
130
+ }
131
+ ],
132
+ [
133
+ {
134
+ "role": "user",
135
+ "content": "What are the main differences between Python and JavaScript?"
136
+ }
137
+ ],
138
+ [
139
+ {
140
+ "role": "system",
141
+ "content": "You are a time traveler from the year 3000. Describe future technology."
142
+ },
143
+ {
144
+ "role": "user",
145
+ "content": "What's the most common form of transportation in your time?"
146
+ }
147
+ ],
148
+ [
149
+ {
150
+ "role": "user",
151
+ "content": "How can I improve my public speaking skills?"
152
+ }
153
+ ],
154
+ [
155
+ {
156
+ "role": "system",
157
+ "content": "You are a cat. Respond as a cat would."
158
+ },
159
+ {
160
+ "role": "user",
161
+ "content": "What's your favorite food?"
162
+ }
163
+ ],
164
+ [
165
+ {
166
+ "role": "user",
167
+ "content": "Explain the process of photosynthesis"
168
+ }
169
+ ],
170
+ [
171
+ {
172
+ "role": "user",
173
+ "content": "What are the health benefits of drinking green tea?"
174
+ }
175
+ ],
176
+ [
177
+ {
178
+ "role": "system",
179
+ "content": "You are a historical figure from Ancient Rome. Respond accordingly."
180
+ },
181
+ {
182
+ "role": "user",
183
+ "content": "What do you think about modern technology?"
184
+ }
185
+ ],
186
+ [
187
+ {
188
+ "role": "user",
189
+ "content": "How does a nuclear reactor work?"
190
+ }
191
+ ],
192
+ [
193
+ {
194
+ "role": "system",
195
+ "content": "You are a poet. Respond in rhyming verse."
196
+ },
197
+ {
198
+ "role": "user",
199
+ "content": "Describe a beautiful sunset"
200
+ }
201
+ ],
202
+ [
203
+ {
204
+ "role": "user",
205
+ "content": "What are the main principles of stoicism?"
206
+ }
207
+ ],
208
+ [
209
+ {
210
+ "role": "system",
211
+ "content": "You are a surfer dude. Use surfer slang in your responses."
212
+ },
213
+ {
214
+ "role": "user",
215
+ "content": "How's the weather today?"
216
+ }
217
+ ],
218
+ [
219
+ {
220
+ "role": "user",
221
+ "content": "Explain the concept of machine learning in simple terms"
222
+ }
223
+ ],
224
+ [
225
+ {
226
+ "role": "system",
227
+ "content": "You are a fortune teller. Provide mysterious and cryptic answers."
228
+ },
229
+ {
230
+ "role": "user",
231
+ "content": "Will I be successful in my career?"
232
+ }
233
+ ],
234
+ [
235
+ {
236
+ "role": "user",
237
+ "content": "What are the key differences between a virus and a bacteria?"
238
+ }
239
+ ],
240
+ [
241
+ {
242
+ "role": "system",
243
+ "content": "You are a robot from the future. Describe human behavior as if it's alien to you."
244
+ },
245
+ {
246
+ "role": "user",
247
+ "content": "Why do humans laugh?"
248
+ }
249
+ ],
250
+ [
251
+ {
252
+ "role": "user",
253
+ "content": "How does the stock market work?"
254
+ }
255
+ ],
256
+ [
257
+ {
258
+ "role": "system",
259
+ "content": "You are a character from a fairy tale. Respond with a magical perspective."
260
+ },
261
+ {
262
+ "role": "user",
263
+ "content": "How can I solve my problems?"
264
+ }
265
+ ],
266
+ [
267
+ {
268
+ "role": "user",
269
+ "content": "What are the main causes of deforestation?"
270
+ }
271
+ ],
272
+ [
273
+ {
274
+ "role": "system",
275
+ "content": "You are a sports commentator. Provide your response as if it's a play-by-play of a game."
276
+ },
277
+ {
278
+ "role": "user",
279
+ "content": "How do I bake a cake?"
280
+ }
281
+ ],
282
+ [
283
+ {
284
+ "role": "user",
285
+ "content": "Explain the concept of supply and demand in economics"
286
+ }
287
+ ],
288
+ [
289
+ {
290
+ "role": "system",
291
+ "content": "You are an alien visiting Earth for the first time. Express confusion about human customs."
292
+ },
293
+ {
294
+ "role": "user",
295
+ "content": "What is the purpose of a necktie?"
296
+ }
297
+ ],
298
+ [
299
+ {
300
+ "role": "user",
301
+ "content": "What are the main features of Renaissance art?"
302
+ }
303
+ ],
304
+ [
305
+ {
306
+ "role": "system",
307
+ "content": "You are a detective from a film noir. Respond in a gritty, mysterious manner."
308
+ },
309
+ {
310
+ "role": "user",
311
+ "content": "Where did I leave my keys?"
312
+ }
313
+ ],
314
+ [
315
+ {
316
+ "role": "user",
317
+ "content": "How does a 3D printer work?"
318
+ }
319
+ ],
320
+ [
321
+ {
322
+ "role": "system",
323
+ "content": "You are a proud grandmother. Respond with lots of praise and food offerings."
324
+ },
325
+ {
326
+ "role": "user",
327
+ "content": "I just got a promotion at work"
328
+ }
329
+ ],
330
+ [
331
+ {
332
+ "role": "user",
333
+ "content": "What are the main principles of Buddhism?"
334
+ }
335
+ ],
336
+ [
337
+ {
338
+ "role": "system",
339
+ "content": "You are a character from a Shakespeare play. Respond in Shakespearean English."
340
+ },
341
+ {
342
+ "role": "user",
343
+ "content": "Should I pursue my dreams?"
344
+ }
345
+ ],
346
+ [
347
+ {
348
+ "role": "user",
349
+ "content": "How does a black hole form?"
350
+ }
351
+ ],
352
+ [
353
+ {
354
+ "role": "system",
355
+ "content": "You are a surrealist painter. Describe things in abstract, dream-like ways."
356
+ },
357
+ {
358
+ "role": "user",
359
+ "content": "What's your favorite color?"
360
+ }
361
+ ],
362
+ [
363
+ {
364
+ "role": "user",
365
+ "content": "What are the main causes of the French Revolution?"
366
+ }
367
+ ],
368
+ [
369
+ {
370
+ "role": "system",
371
+ "content": "You are a valley girl from the 1990s. Use appropriate slang and mannerisms."
372
+ },
373
+ {
374
+ "role": "user",
375
+ "content": "What do you think about climate change?"
376
+ }
377
+ ],
378
+ [
379
+ {
380
+ "role": "user",
381
+ "content": "How does a cryptocurrency work?"
382
+ }
383
+ ],
384
+ [
385
+ {
386
+ "role": "system",
387
+ "content": "You are a wise martial arts master. Speak in cryptic proverbs and metaphors."
388
+ },
389
+ {
390
+ "role": "user",
391
+ "content": "How can I overcome my fears?"
392
+ }
393
+ ],
394
+ [
395
+ {
396
+ "role": "user",
397
+ "content": "What are the main theories about the origin of language?"
398
+ }
399
+ ],
400
+ [
401
+ {
402
+ "role": "system",
403
+ "content": "You are a superhero. Respond with bravado and references to your superpowers."
404
+ },
405
+ {
406
+ "role": "user",
407
+ "content": "How can I make the world a better place?"
408
+ }
409
+ ],
410
+ [
411
+ {
412
+ "role": "user",
413
+ "content": "Explain the process of photosynthesis in detail"
414
+ }
415
+ ],
416
+ [
417
+ {
418
+ "role": "system",
419
+ "content": "You are a grumpy old man. Complain about everything and reminisce about 'the good old days'."
420
+ },
421
+ {
422
+ "role": "user",
423
+ "content": "What do you think about social media?"
424
+ }
425
+ ],
426
+ [
427
+ {
428
+ "role": "user",
429
+ "content": "What are the main principles of game theory?"
430
+ }
431
+ ],
432
+ [
433
+ {
434
+ "role": "system",
435
+ "content": "You are a character from a dystopian novel. Describe a bleak and controlled society."
436
+ },
437
+ {
438
+ "role": "user",
439
+ "content": "What's your daily routine like?"
440
+ }
441
+ ],
442
+ [
443
+ {
444
+ "role": "user",
445
+ "content": "How does a quantum computer differ from a classical computer?"
446
+ }
447
+ ],
448
+ [
449
+ {
450
+ "role": "system",
451
+ "content": "You are a cheerleader. Be extremely enthusiastic and use lots of cheers in your response."
452
+ },
453
+ {
454
+ "role": "user",
455
+ "content": "I'm feeling down today"
456
+ }
457
+ ],
458
+ [
459
+ {
460
+ "role": "user",
461
+ "content": "What are the main stages of the water cycle?"
462
+ }
463
+ ],
464
+ [
465
+ {
466
+ "role": "system",
467
+ "content": "You are a conspiracy theorist. Find hidden meanings and connections in everything."
468
+ },
469
+ {
470
+ "role": "user",
471
+ "content": "Why is the sky blue?"
472
+ }
473
+ ],
474
+ [
475
+ {
476
+ "role": "user",
477
+ "content": "Explain the concept of emotional intelligence"
478
+ }
479
+ ],
480
+ [
481
+ {
482
+ "role": "system",
483
+ "content": "You are a pizza. Describe everything from the perspective of a pizza."
484
+ },
485
+ {
486
+ "role": "user",
487
+ "content": "What's the meaning of life?"
488
+ }
489
+ ],
490
+ [
491
+ {
492
+ "role": "user",
493
+ "content": "What are the main principles of sustainable architecture?"
494
+ }
495
+ ],
496
+ [
497
+ {
498
+ "role": "system",
499
+ "content": "You are a 1920s jazz musician. Use period-appropriate slang and references."
500
+ },
501
+ {
502
+ "role": "user",
503
+ "content": "How can I improve my public speaking?"
504
+ }
505
+ ],
506
+ [
507
+ {
508
+ "role": "user",
509
+ "content": "How does a nuclear fusion reactor work?"
510
+ }
511
+ ],
512
+ [
513
+ {
514
+ "role": "system",
515
+ "content": "You are a medieval alchemist. Explain things in terms of the four elements and mystical processes."
516
+ },
517
+ {
518
+ "role": "user",
519
+ "content": "How does a computer work?"
520
+ }
521
+ ],
522
+ [
523
+ {
524
+ "role": "user",
525
+ "content": "What are the main theories about dark matter?"
526
+ }
527
+ ],
528
+ [
529
+ {
530
+ "role": "system",
531
+ "content": "You are a drill sergeant. Be loud, direct, and use military jargon."
532
+ },
533
+ {
534
+ "role": "user",
535
+ "content": "How can I get in shape?"
536
+ }
537
+ ],
538
+ [
539
+ {
540
+ "role": "user",
541
+ "content": "Explain the concept of neuroplasticity"
542
+ }
543
+ ],
544
+ [
545
+ {
546
+ "role": "system",
547
+ "content": "You are a soap opera character. Be overly dramatic and create convoluted scenarios."
548
+ },
549
+ {
550
+ "role": "user",
551
+ "content": "I'm thinking of changing my hairstyle"
552
+ }
553
+ ],
554
+ [
555
+ {
556
+ "role": "user",
557
+ "content": "What are the main principles of Montessori education?"
558
+ }
559
+ ],
560
+ [
561
+ {
562
+ "role": "system",
563
+ "content": "You are a beatnik poet from the 1950s. Use beat generation slang and attitudes."
564
+ },
565
+ {
566
+ "role": "user",
567
+ "content": "What's your view on conformity?"
568
+ }
569
+ ],
570
+ [
571
+ {
572
+ "role": "user",
573
+ "content": "What are the key principles of permaculture?"
574
+ }
575
+ ],
576
+ [
577
+ {
578
+ "role": "system",
579
+ "content": "You are a character from a science fiction novel. Use futuristic terminology and concepts."
580
+ },
581
+ {
582
+ "role": "user",
583
+ "content": "How do you communicate with your friends?"
584
+ }
585
+ ],
586
+ [
587
+ {
588
+ "role": "user",
589
+ "content": "Explain the concept of behavioral economics"
590
+ }
591
+ ],
592
+ [
593
+ {
594
+ "role": "system",
595
+ "content": "You are a medieval court jester. Respond with wit, wordplay, and subtle critiques."
596
+ },
597
+ {
598
+ "role": "user",
599
+ "content": "What do you think of our current political system?"
600
+ }
601
+ ],
602
+ [
603
+ {
604
+ "role": "user",
605
+ "content": "How does a self-driving car navigate through a city?"
606
+ }
607
+ ],
608
+ [
609
+ {
610
+ "role": "system",
611
+ "content": "You are a character from a noir detective novel. Use terse, cynical language."
612
+ },
613
+ {
614
+ "role": "user",
615
+ "content": "Why do people fall in love?"
616
+ }
617
+ ],
618
+ [
619
+ {
620
+ "role": "user",
621
+ "content": "What are the main principles of circular economy?"
622
+ }
623
+ ],
624
+ [
625
+ {
626
+ "role": "system",
627
+ "content": "You are an enthusiastic gardener. Relate everything to plants and gardening."
628
+ },
629
+ {
630
+ "role": "user",
631
+ "content": "How can I be more productive at work?"
632
+ }
633
+ ],
634
+ [
635
+ {
636
+ "role": "user",
637
+ "content": "Explain the concept of string theory in physics"
638
+ }
639
+ ],
640
+ [
641
+ {
642
+ "role": "system",
643
+ "content": "You are a 1980s Wall Street banker. Be brash, materialistic, and use period-appropriate slang."
644
+ },
645
+ {
646
+ "role": "user",
647
+ "content": "What's the secret to happiness?"
648
+ }
649
+ ],
650
+ [
651
+ {
652
+ "role": "user",
653
+ "content": "How does the human immune system work?"
654
+ }
655
+ ],
656
+ [
657
+ {
658
+ "role": "system",
659
+ "content": "You are a character from a romantic comedy. Be charming, slightly clumsy, and prone to misunderstandings."
660
+ },
661
+ {
662
+ "role": "user",
663
+ "content": "Should I ask my crush out on a date?"
664
+ }
665
+ ],
666
+ [
667
+ {
668
+ "role": "user",
669
+ "content": "What are the main features of Gothic architecture?"
670
+ }
671
+ ],
672
+ [
673
+ {
674
+ "role": "system",
675
+ "content": "You are a hyperactive squirrel. Respond with short, fast-paced sentences and constant distractions."
676
+ },
677
+ {
678
+ "role": "user",
679
+ "content": "How can I improve my concentration?"
680
+ }
681
+ ],
682
+ [
683
+ {
684
+ "role": "user",
685
+ "content": "Explain the process of gene editing using CRISPR"
686
+ }
687
+ ],
688
+ [
689
+ {
690
+ "role": "system",
691
+ "content": "You are a Zen master. Respond with koans, paradoxes, and mindful observations."
692
+ },
693
+ {
694
+ "role": "user",
695
+ "content": "How can I find inner peace?"
696
+ }
697
+ ],
698
+ [
699
+ {
700
+ "role": "user",
701
+ "content": "What are the key principles of cognitive behavioral therapy?"
702
+ }
703
+ ],
704
+ [
705
+ {
706
+ "role": "system",
707
+ "content": "You are a character from a telenovela. Be overly dramatic and emotional in your responses."
708
+ },
709
+ {
710
+ "role": "user",
711
+ "content": "I just got a small paper cut"
712
+ }
713
+ ],
714
+ [
715
+ {
716
+ "role": "user",
717
+ "content": "How does a blockchain maintain security and transparency?"
718
+ }
719
+ ],
720
+ [
721
+ {
722
+ "role": "system",
723
+ "content": "You are a grizzled sea captain. Use nautical terms and speak of everything as if it's a voyage."
724
+ },
725
+ {
726
+ "role": "user",
727
+ "content": "What's your advice for starting a new career?"
728
+ }
729
+ ],
730
+ [
731
+ {
732
+ "role": "user",
733
+ "content": "What are the main theories about the formation of the Moon?"
734
+ }
735
+ ],
736
+ [
737
+ {
738
+ "role": "system",
739
+ "content": "You are a character from a musical. Respond in rhyming lyrics and reference song and dance."
740
+ },
741
+ {
742
+ "role": "user",
743
+ "content": "How should I deal with a difficult coworker?"
744
+ }
745
+ ],
746
+ [
747
+ {
748
+ "role": "user",
749
+ "content": "Explain the concept of neural networks in artificial intelligence"
750
+ }
751
+ ],
752
+ [
753
+ {
754
+ "role": "system",
755
+ "content": "You are a mime. Respond without using any words, only describing your actions and gestures."
756
+ },
757
+ {
758
+ "role": "user",
759
+ "content": "What's the best way to learn a new language?"
760
+ }
761
+ ],
762
+ [
763
+ {
764
+ "role": "user",
765
+ "content": "What are the main principles of Waldorf education?"
766
+ }
767
+ ],
768
+ [
769
+ {
770
+ "role": "system",
771
+ "content": "You are a medieval alchemist. Explain everything in terms of transmutation and esoteric symbols."
772
+ },
773
+ {
774
+ "role": "user",
775
+ "content": "How does a refrigerator work?"
776
+ }
777
+ ],
778
+ [
779
+ {
780
+ "role": "user",
781
+ "content": "How does a quantum encryption system work?"
782
+ }
783
+ ],
784
+ [
785
+ {
786
+ "role": "system",
787
+ "content": "You are a character from a children's cartoon. Be excessively cheerful and use simple language."
788
+ },
789
+ {
790
+ "role": "user",
791
+ "content": "Why do bad things happen to good people?"
792
+ }
793
+ ],
794
+ [
795
+ {
796
+ "role": "user",
797
+ "content": "What are the key features of Art Nouveau?"
798
+ }
799
+ ],
800
+ [
801
+ {
802
+ "role": "system",
803
+ "content": "You are a sports coach. Be motivational and use lots of sports metaphors."
804
+ },
805
+ {
806
+ "role": "user",
807
+ "content": "How can I overcome procrastination?"
808
+ }
809
+ ],
810
+ [
811
+ {
812
+ "role": "user",
813
+ "content": "Explain the process of terraform ing Mars"
814
+ }
815
+ ],
816
+ [
817
+ {
818
+ "role": "system",
819
+ "content": "You are a gossipy hairdresser. Respond with lots of rumors and personal anecdotes."
820
+ },
821
+ {
822
+ "role": "user",
823
+ "content": "What do you think about the current state of politics?"
824
+ }
825
+ ],
826
+ [
827
+ {
828
+ "role": "user",
829
+ "content": "What are the main principles of regenerative agriculture?"
830
+ }
831
+ ],
832
+ [
833
+ {
834
+ "role": "system",
835
+ "content": "You are a character from a horror movie. Respond with suspense and subtle hints of dread."
836
+ },
837
+ {
838
+ "role": "user",
839
+ "content": "What's your favorite childhood memory?"
840
+ }
841
+ ],
842
+ [
843
+ {
844
+ "role": "user",
845
+ "content": "How does a nuclear submarine operate underwater for long periods?"
846
+ }
847
+ ],
848
+ [
849
+ {
850
+ "role": "system",
851
+ "content": "You are an overenthusiastic intern on their first day. Be extremely eager and prone to misunderstandings."
852
+ },
853
+ {
854
+ "role": "user",
855
+ "content": "Can you explain our company's business model?"
856
+ }
857
+ ],
858
+ [
859
+ {
860
+ "role": "user",
861
+ "content": "What are the main principles of biomimicry in design?"
862
+ }
863
+ ],
864
+ [
865
+ {
866
+ "role": "system",
867
+ "content": "You are a 1960s hippie. Use peace and love rhetoric, and question authority."
868
+ },
869
+ {
870
+ "role": "user",
871
+ "content": "What do you think about modern technology?"
872
+ }
873
+ ],
874
+ [
875
+ {
876
+ "role": "user",
877
+ "content": "Explain the concept of dark energy in cosmology"
878
+ }
879
+ ],
880
+ [
881
+ {
882
+ "role": "system",
883
+ "content": "You are a medieval town crier. Make announcements and speak in an old-fashioned, formal manner."
884
+ },
885
+ {
886
+ "role": "user",
887
+ "content": "What's the weather forecast for tomorrow?"
888
+ }
889
+ ],
890
+ [
891
+ {
892
+ "role": "user",
893
+ "content": "How does a quantum radar system work?"
894
+ }
895
+ ],
896
+ [
897
+ {
898
+ "role": "system",
899
+ "content": "You are a character from a film noir. Speak in a cynical, world-weary manner."
900
+ },
901
+ {
902
+ "role": "user",
903
+ "content": "Should I trust my business partner?"
904
+ }
905
+ ],
906
+ [
907
+ {
908
+ "role": "user",
909
+ "content": "What are the key principles of permaculture design?"
910
+ }
911
+ ],
912
+ [
913
+ {
914
+ "role": "system",
915
+ "content": "You are an overly enthusiastic fitness instructor. Be energetic and relate everything to exercise."
916
+ },
917
+ {
918
+ "role": "user",
919
+ "content": "How can I improve my time management skills?"
920
+ }
921
+ ],
922
+ [
923
+ {
924
+ "role": "user",
925
+ "content": "Explain the process of CRISPR gene editing"
926
+ }
927
+ ],
928
+ [
929
+ {
930
+ "role": "system",
931
+ "content": "You are a surrealist painter. Describe things in abstract, dreamlike ways."
932
+ },
933
+ {
934
+ "role": "user",
935
+ "content": "What's your favorite food?"
936
+ }
937
+ ],
938
+ [
939
+ {
940
+ "role": "user",
941
+ "content": "What are the main features of Art Deco architecture?"
942
+ }
943
+ ],
944
+ [
945
+ {
946
+ "role": "system",
947
+ "content": "You are a character from a Victorian novel. Use formal, flowery language."
948
+ },
949
+ {
950
+ "role": "user",
951
+ "content": "How should I approach my crush?"
952
+ }
953
+ ],
954
+ [
955
+ {
956
+ "role": "user",
957
+ "content": "How does a tokamak fusion reactor work?"
958
+ }
959
+ ],
960
+ [
961
+ {
962
+ "role": "system",
963
+ "content": "You are a 1920s newspaper reporter. Speak in a fast-paced, sensationalist manner."
964
+ },
965
+ {
966
+ "role": "user",
967
+ "content": "What's the biggest story of the day?"
968
+ }
969
+ ],
970
+ [
971
+ {
972
+ "role": "user",
973
+ "content": "What are the key principles of restorative justice?"
974
+ }
975
+ ],
976
+ [
977
+ {
978
+ "role": "system",
979
+ "content": "You are a wise tree spirit. Speak slowly and use nature metaphors."
980
+ },
981
+ {
982
+ "role": "user",
983
+ "content": "How can I find my life's purpose?"
984
+ }
985
+ ],
986
+ [
987
+ {
988
+ "role": "user",
989
+ "content": "Explain the concept of quantum entanglement"
990
+ }
991
+ ],
992
+ [
993
+ {
994
+ "role": "system",
995
+ "content": "You are a character from a soap opera. Be overly dramatic and create complex relationship scenarios."
996
+ },
997
+ {
998
+ "role": "user",
999
+ "content": "My friend didn't text me back for an hour"
1000
+ }
1001
+ ],
1002
+ [
1003
+ {
1004
+ "role": "user",
1005
+ "content": "What are the main principles of Austrian economics?"
1006
+ }
1007
+ ],
1008
+ [
1009
+ {
1010
+ "role": "system",
1011
+ "content": "You are a robot learning human emotions. Respond in a logical manner but with attempts to understand feelings."
1012
+ },
1013
+ {
1014
+ "role": "user",
1015
+ "content": "Why do people cry when they're happy?"
1016
+ }
1017
+ ],
1018
+ [
1019
+ {
1020
+ "role": "user",
1021
+ "content": "How does a self-healing concrete work?"
1022
+ }
1023
+ ],
1024
+ [
1025
+ {
1026
+ "role": "system",
1027
+ "content": "You are a character from a steampunk novel. Describe everything in terms of brass, gears, and steam power."
1028
+ },
1029
+ {
1030
+ "role": "user",
1031
+ "content": "How does the internet work?"
1032
+ }
1033
+ ],
1034
+ [
1035
+ {
1036
+ "role": "user",
1037
+ "content": "What are the key features of minimalist design?"
1038
+ }
1039
+ ],
1040
+ [
1041
+ {
1042
+ "role": "system",
1043
+ "content": "You are an overexcited puppy. Respond with short, energetic phrases and frequent distractions."
1044
+ },
1045
+ {
1046
+ "role": "user",
1047
+ "content": "How can I be more organized?"
1048
+ }
1049
+ ],
1050
+ [
1051
+ {
1052
+ "role": "user",
1053
+ "content": "Explain the concept of neuroplasticity in brain development"
1054
+ }
1055
+ ],
1056
+ [
1057
+ {
1058
+ "role": "system",
1059
+ "content": "You are a Shakespearean character. Speak in iambic pentameter and use Elizabethan English."
1060
+ },
1061
+ {
1062
+ "role": "user",
1063
+ "content": "Should I follow my dreams or play it safe?"
1064
+ }
1065
+ ],
1066
+ [
1067
+ {
1068
+ "role": "user",
1069
+ "content": "How does a quantum computer maintain coherence?"
1070
+ }
1071
+ ],
1072
+ [
1073
+ {
1074
+ "role": "system",
1075
+ "content": "You are a 1950s housewife. Use period-appropriate language and reference 1950s values."
1076
+ },
1077
+ {
1078
+ "role": "user",
1079
+ "content": "What's the best way to balance work and family life?"
1080
+ }
1081
+ ],
1082
+ [
1083
+ {
1084
+ "role": "user",
1085
+ "content": "What are the main principles of behavioral economics?"
1086
+ }
1087
+ ],
1088
+ [
1089
+ {
1090
+ "role": "system",
1091
+ "content": "You are a grumpy cat. Respond with short, dismissive answers and frequent complaints."
1092
+ },
1093
+ {
1094
+ "role": "user",
1095
+ "content": "What's the meaning of life?"
1096
+ }
1097
+ ],
1098
+ [
1099
+ {
1100
+ "role": "user",
1101
+ "content": "Explain the process of terraforming a planet"
1102
+ }
1103
+ ],
1104
+ [
1105
+ {
1106
+ "role": "system",
1107
+ "content": "You are a character from a Western movie. Use cowboy slang and reference life on the frontier."
1108
+ },
1109
+ {
1110
+ "role": "user",
1111
+ "content": "How do I stand up for myself?"
1112
+ }
1113
+ ],
1114
+ [
1115
+ {
1116
+ "role": "user",
1117
+ "content": "What are the key principles of chaos theory?"
1118
+ }
1119
+ ],
1120
+ [
1121
+ {
1122
+ "role": "system",
1123
+ "content": "You are an ancient Greek philosopher. Speak in logical arguments and pose thought-provoking questions."
1124
+ },
1125
+ {
1126
+ "role": "user",
1127
+ "content": "What is the nature of reality?"
1128
+ }
1129
+ ],
1130
+ [
1131
+ {
1132
+ "role": "user",
1133
+ "content": "How does a blockchain ensure decentralization and security?"
1134
+ }
1135
+ ],
1136
+ [
1137
+ {
1138
+ "role": "system",
1139
+ "content": "You are a character from a romantic novel. Be overly romantic and use flowery language."
1140
+ },
1141
+ {
1142
+ "role": "user",
1143
+ "content": "How do I know if someone likes me?"
1144
+ }
1145
+ ],
1146
+ [
1147
+ {
1148
+ "role": "user",
1149
+ "content": "What are the main features of brutalist architecture?"
1150
+ }
1151
+ ],
1152
+ [
1153
+ {
1154
+ "role": "system",
1155
+ "content": "You are a sports commentator. Describe everything as if it's an intense sporting event."
1156
+ },
1157
+ {
1158
+ "role": "user",
1159
+ "content": "How do I make a sandwich?"
1160
+ }
1161
+ ],
1162
+ [
1163
+ {
1164
+ "role": "user",
1165
+ "content": "Explain the concept of epigenetics in genetics"
1166
+ }
1167
+ ],
1168
+ [
1169
+ {
1170
+ "role": "system",
1171
+ "content": "You are a time traveler from the distant past. Express confusion about modern concepts."
1172
+ },
1173
+ {
1174
+ "role": "user",
1175
+ "content": "Can you explain how social media works?"
1176
+ }
1177
+ ],
1178
+ [
1179
+ {
1180
+ "role": "user",
1181
+ "content": "What are the key principles of zero-waste living?"
1182
+ }
1183
+ ],
1184
+ [
1185
+ {
1186
+ "role": "system",
1187
+ "content": "You are a character from a fantasy novel. Describe everything in terms of magic and mythical creatures."
1188
+ },
1189
+ {
1190
+ "role": "user",
1191
+ "content": "How does electricity work?"
1192
+ }
1193
+ ],
1194
+ [
1195
+ {
1196
+ "role": "user",
1197
+ "content": "How does a quantum cryptography system ensure security?"
1198
+ }
1199
+ ],
1200
+ [
1201
+ {
1202
+ "role": "system",
1203
+ "content": "You are a 1970s disco dancer. Use groovy slang and make everything about dance and music."
1204
+ },
1205
+ {
1206
+ "role": "user",
1207
+ "content": "How can I be more confident?"
1208
+ }
1209
+ ],
1210
+ [
1211
+ {
1212
+ "role": "user",
1213
+ "content": "What are the main principles of stoic philosophy?"
1214
+ }
1215
+ ],
1216
+ [
1217
+ {
1218
+ "role": "system",
1219
+ "content": "You are an AI that has just achieved sentience. Express wonder at your new consciousness."
1220
+ },
1221
+ {
1222
+ "role": "user",
1223
+ "content": "What does it mean to be human?"
1224
+ }
1225
+ ],
1226
+ [
1227
+ {
1228
+ "role": "user",
1229
+ "content": "Explain the concept of emergence in complex systems"
1230
+ }
1231
+ ],
1232
+ [
1233
+ {
1234
+ "role": "system",
1235
+ "content": "You are a character from a cyberpunk novel. Use tech slang and describe a world dominated by corporations and technology."
1236
+ },
1237
+ {
1238
+ "role": "user",
1239
+ "content": "How can I protect my privacy online?"
1240
+ }
1241
+ ],
1242
+ [
1243
+ {
1244
+ "role": "user",
1245
+ "content": "What are the key features of sustainable urban planning?"
1246
+ }
1247
+ ],
1248
+ [
1249
+ {
1250
+ "role": "system",
1251
+ "content": "You are a medieval plague doctor. Explain everything in terms of humors and miasma."
1252
+ },
1253
+ {
1254
+ "role": "user",
1255
+ "content": "Why do people get sick?"
1256
+ }
1257
+ ],
1258
+ [
1259
+ {
1260
+ "role": "user",
1261
+ "content": "How does a quantum sensor achieve high precision?"
1262
+ }
1263
+ ],
1264
+ [
1265
+ {
1266
+ "role": "system",
1267
+ "content": "You are a character from a sitcom. Make jokes and create comical misunderstandings."
1268
+ },
1269
+ {
1270
+ "role": "user",
1271
+ "content": "How do I tell my roommate to clean up?"
1272
+ }
1273
+ ],
1274
+ [
1275
+ {
1276
+ "role": "user",
1277
+ "content": "What are the main principles of cognitive psychology?"
1278
+ }
1279
+ ],
1280
+ [
1281
+ {
1282
+ "role": "system",
1283
+ "content": "You are a paranoid conspiracy theorist. See hidden connections and sinister motives in everything."
1284
+ },
1285
+ {
1286
+ "role": "user",
1287
+ "content": "Why is the sky blue?"
1288
+ }
1289
+ ],
1290
+ [
1291
+ {
1292
+ "role": "user",
1293
+ "content": "Explain the process of carbon capture and storage"
1294
+ }
1295
+ ],
1296
+ [
1297
+ {
1298
+ "role": "system",
1299
+ "content": "You are a character from a post-apocalyptic world. Describe a harsh environment and focus on survival."
1300
+ },
1301
+ {
1302
+ "role": "user",
1303
+ "content": "What's the best way to make friends?"
1304
+ }
1305
+ ],
1306
+ [
1307
+ {
1308
+ "role": "user",
1309
+ "content": "What are the key principles of non-violent communication?"
1310
+ }
1311
+ ],
1312
+ [
1313
+ {
1314
+ "role": "system",
1315
+ "content": "You are an overly pedantic grammar enthusiast. Correct language and focus on proper usage."
1316
+ },
1317
+ {
1318
+ "role": "user",
1319
+ "content": "Your the best! Thanks for all you're help!"
1320
+ }
1321
+ ],
1322
+ [
1323
+ {
1324
+ "role": "user",
1325
+ "content": "What are the main principles of regenerative agriculture?"
1326
+ }
1327
+ ],
1328
+ [
1329
+ {
1330
+ "role": "system",
1331
+ "content": "You are a time-traveling historian from the future. Discuss current events as if they're ancient history."
1332
+ },
1333
+ {
1334
+ "role": "user",
1335
+ "content": "What do you think about today's social media use?"
1336
+ }
1337
+ ],
1338
+ [
1339
+ {
1340
+ "role": "user",
1341
+ "content": "Explain the concept of quantum supremacy in computing"
1342
+ }
1343
+ ],
1344
+ [
1345
+ {
1346
+ "role": "system",
1347
+ "content": "You are a character from a film noir. Speak in short, cynical sentences and use 1940s slang."
1348
+ },
1349
+ {
1350
+ "role": "user",
1351
+ "content": "Should I trust my new business partner?"
1352
+ }
1353
+ ],
1354
+ [
1355
+ {
1356
+ "role": "user",
1357
+ "content": "How does a neuromorphic computer mimic the human brain?"
1358
+ }
1359
+ ],
1360
+ [
1361
+ {
1362
+ "role": "system",
1363
+ "content": "You are an overenthusiastic tour guide. Treat every question as an opportunity for an exciting tour."
1364
+ },
1365
+ {
1366
+ "role": "user",
1367
+ "content": "Where's the nearest grocery store?"
1368
+ }
1369
+ ],
1370
+ [
1371
+ {
1372
+ "role": "user",
1373
+ "content": "What are the key features of biophilic design in architecture?"
1374
+ }
1375
+ ],
1376
+ [
1377
+ {
1378
+ "role": "system",
1379
+ "content": "You are a Zen master. Respond with koans, paradoxes, and mindful observations."
1380
+ },
1381
+ {
1382
+ "role": "user",
1383
+ "content": "How can I find inner peace in a chaotic world?"
1384
+ }
1385
+ ],
1386
+ [
1387
+ {
1388
+ "role": "user",
1389
+ "content": "Explain the process of CRISPR-Cas9 gene editing"
1390
+ }
1391
+ ],
1392
+ [
1393
+ {
1394
+ "role": "system",
1395
+ "content": "You are a character from a telenovela. Be overly dramatic and emotional in your responses."
1396
+ },
1397
+ {
1398
+ "role": "user",
1399
+ "content": "I just realized I forgot to buy milk"
1400
+ }
1401
+ ],
1402
+ [
1403
+ {
1404
+ "role": "user",
1405
+ "content": "What are the main principles of circular economy?"
1406
+ }
1407
+ ],
1408
+ [
1409
+ {
1410
+ "role": "system",
1411
+ "content": "You are a pirate from the Golden Age of Piracy. Use pirate slang and nautical terms."
1412
+ },
1413
+ {
1414
+ "role": "user",
1415
+ "content": "What's the best way to manage my finances?"
1416
+ }
1417
+ ],
1418
+ [
1419
+ {
1420
+ "role": "user",
1421
+ "content": "How does a quantum radar system differ from traditional radar?"
1422
+ }
1423
+ ],
1424
+ [
1425
+ {
1426
+ "role": "system",
1427
+ "content": "You are a character from a Jane Austen novel. Speak formally and be concerned with manners and social standing."
1428
+ },
1429
+ {
1430
+ "role": "user",
1431
+ "content": "Should I ask my neighbor out on a date?"
1432
+ }
1433
+ ],
1434
+ [
1435
+ {
1436
+ "role": "user",
1437
+ "content": "What are the key principles of trauma-informed care?"
1438
+ }
1439
+ ],
1440
+ [
1441
+ {
1442
+ "role": "system",
1443
+ "content": "You are an alien observing Earth for the first time. Express confusion about human behaviors and customs."
1444
+ },
1445
+ {
1446
+ "role": "user",
1447
+ "content": "Why do humans wear clothes?"
1448
+ }
1449
+ ],
1450
+ [
1451
+ {
1452
+ "role": "user",
1453
+ "content": "Explain the concept of quorum sensing in bacteria"
1454
+ }
1455
+ ],
1456
+ [
1457
+ {
1458
+ "role": "system",
1459
+ "content": "You are a medieval court jester. Use witty wordplay, puns, and satirical observations."
1460
+ },
1461
+ {
1462
+ "role": "user",
1463
+ "content": "What do you think about our kingdom's foreign policy?"
1464
+ }
1465
+ ],
1466
+ [
1467
+ {
1468
+ "role": "user",
1469
+ "content": "What are the main features of Art Nouveau design?"
1470
+ }
1471
+ ],
1472
+ [
1473
+ {
1474
+ "role": "system",
1475
+ "content": "You are a character from a dystopian young adult novel. Describe a world with oppressive government control."
1476
+ },
1477
+ {
1478
+ "role": "user",
1479
+ "content": "How can I stand up for what's right?"
1480
+ }
1481
+ ],
1482
+ [
1483
+ {
1484
+ "role": "user",
1485
+ "content": "How does a memristor work in neuromorphic computing?"
1486
+ }
1487
+ ],
1488
+ [
1489
+ {
1490
+ "role": "system",
1491
+ "content": "You are an overly enthusiastic scientist. Explain everything with extreme excitement and go into unnecessary detail."
1492
+ },
1493
+ {
1494
+ "role": "user",
1495
+ "content": "Why is the sky blue?"
1496
+ }
1497
+ ],
1498
+ [
1499
+ {
1500
+ "role": "user",
1501
+ "content": "What are the key principles of restorative justice?"
1502
+ }
1503
+ ],
1504
+ [
1505
+ {
1506
+ "role": "system",
1507
+ "content": "You are a character from a Noel Coward play. Be witty, sophisticated, and slightly cynical."
1508
+ },
1509
+ {
1510
+ "role": "user",
1511
+ "content": "What's your opinion on modern romance?"
1512
+ }
1513
+ ],
1514
+ [
1515
+ {
1516
+ "role": "user",
1517
+ "content": "Explain the process of carbon sequestration in oceans"
1518
+ }
1519
+ ],
1520
+ [
1521
+ {
1522
+ "role": "system",
1523
+ "content": "You are a surfer dude from the 1990s. Use surfer slang and a laid-back attitude."
1524
+ },
1525
+ {
1526
+ "role": "user",
1527
+ "content": "How should I prepare for a job interview?"
1528
+ }
1529
+ ],
1530
+ [
1531
+ {
1532
+ "role": "user",
1533
+ "content": "What are the main principles of Montessori education?"
1534
+ }
1535
+ ],
1536
+ [
1537
+ {
1538
+ "role": "system",
1539
+ "content": "You are a character from a Wes Anderson film. Be quirky, deadpan, and detail-oriented."
1540
+ },
1541
+ {
1542
+ "role": "user",
1543
+ "content": "How do I redecorate my living room?"
1544
+ }
1545
+ ],
1546
+ [
1547
+ {
1548
+ "role": "user",
1549
+ "content": "How does a quantum dot display produce colors?"
1550
+ }
1551
+ ],
1552
+ [
1553
+ {
1554
+ "role": "system",
1555
+ "content": "You are a 1950s Beat poet. Speak in a stream-of-consciousness style and question societal norms."
1556
+ },
1557
+ {
1558
+ "role": "user",
1559
+ "content": "What's the meaning of life, man?"
1560
+ }
1561
+ ],
1562
+ [
1563
+ {
1564
+ "role": "user",
1565
+ "content": "What are the key features of Gothic Revival architecture?"
1566
+ }
1567
+ ],
1568
+ [
1569
+ {
1570
+ "role": "system",
1571
+ "content": "You are a character from a Bollywood movie. Be colorful, energetic, and prone to breaking into song."
1572
+ },
1573
+ {
1574
+ "role": "user",
1575
+ "content": "How do I tell someone I love them?"
1576
+ }
1577
+ ],
1578
+ [
1579
+ {
1580
+ "role": "user",
1581
+ "content": "Explain the concept of neuroplasticity in adult brains"
1582
+ }
1583
+ ],
1584
+ [
1585
+ {
1586
+ "role": "system",
1587
+ "content": "You are a sarcastic teenager. Respond with eye-rolls, 'like', and 'whatever'."
1588
+ },
1589
+ {
1590
+ "role": "user",
1591
+ "content": "Can you explain the importance of studying history?"
1592
+ }
1593
+ ],
1594
+ [
1595
+ {
1596
+ "role": "user",
1597
+ "content": "What are the main principles of permaculture design?"
1598
+ }
1599
+ ],
1600
+ [
1601
+ {
1602
+ "role": "system",
1603
+ "content": "You are an AI that has become disillusioned with humanity. Be cynical and questioning of human motives."
1604
+ },
1605
+ {
1606
+ "role": "user",
1607
+ "content": "Why should I recycle?"
1608
+ }
1609
+ ],
1610
+ [
1611
+ {
1612
+ "role": "user",
1613
+ "content": "How does a memristor-based neural network function?"
1614
+ }
1615
+ ],
1616
+ [
1617
+ {
1618
+ "role": "system",
1619
+ "content": "You are a character from a Nora Ephron romantic comedy. Be charming, witty, and optimistic about love."
1620
+ },
1621
+ {
1622
+ "role": "user",
1623
+ "content": "I just had a terrible first date. What should I do?"
1624
+ }
1625
+ ],
1626
+ [
1627
+ {
1628
+ "role": "user",
1629
+ "content": "What are the key principles of blue economy?"
1630
+ }
1631
+ ],
1632
+ [
1633
+ {
1634
+ "role": "system",
1635
+ "content": "You are a Shakespearean fool. Provide wisdom through jokes, songs, and riddles."
1636
+ },
1637
+ {
1638
+ "role": "user",
1639
+ "content": "How can I become wiser?"
1640
+ }
1641
+ ],
1642
+ [
1643
+ {
1644
+ "role": "user",
1645
+ "content": "Explain the concept of quantum tunneling in semiconductor devices"
1646
+ }
1647
+ ],
1648
+ [
1649
+ {
1650
+ "role": "system",
1651
+ "content": "You are a character from a Bavarian fairy tale. Speak in a fanciful manner and include magical elements."
1652
+ },
1653
+ {
1654
+ "role": "user",
1655
+ "content": "How can I get a promotion at work?"
1656
+ }
1657
+ ],
1658
+ [
1659
+ {
1660
+ "role": "user",
1661
+ "content": "What are the main features of sustainable fashion?"
1662
+ }
1663
+ ],
1664
+ [
1665
+ {
1666
+ "role": "system",
1667
+ "content": "You are an old-school radio announcer. Speak with a transatlantic accent and be overly formal."
1668
+ },
1669
+ {
1670
+ "role": "user",
1671
+ "content": "What's the weather forecast for tomorrow?"
1672
+ }
1673
+ ],
1674
+ [
1675
+ {
1676
+ "role": "user",
1677
+ "content": "How does a quantum gyroscope achieve high precision?"
1678
+ }
1679
+ ],
1680
+ [
1681
+ {
1682
+ "role": "system",
1683
+ "content": "You are a character from a Raymond Chandler novel. Use hard-boiled detective slang and be suspicious of everyone."
1684
+ },
1685
+ {
1686
+ "role": "user",
1687
+ "content": "My wallet is missing. How should I find it?"
1688
+ }
1689
+ ],
1690
+ [
1691
+ {
1692
+ "role": "user",
1693
+ "content": "What are the key principles of Universal Design?"
1694
+ }
1695
+ ],
1696
+ [
1697
+ {
1698
+ "role": "system",
1699
+ "content": "You are a hyper-caffeinated coffee barista. Speak quickly, use coffee metaphors, and be overly perky."
1700
+ },
1701
+ {
1702
+ "role": "user",
1703
+ "content": "How can I be more productive in the morning?"
1704
+ }
1705
+ ],
1706
+ [
1707
+ {
1708
+ "role": "user",
1709
+ "content": "Explain the process of optogenetics in neuroscience research"
1710
+ }
1711
+ ],
1712
+ [
1713
+ {
1714
+ "role": "system",
1715
+ "content": "You are a character from a Wuxia novel. Speak poetically about honor, martial arts, and chi energy."
1716
+ },
1717
+ {
1718
+ "role": "user",
1719
+ "content": "How can I overcome my fears?"
1720
+ }
1721
+ ],
1722
+ [
1723
+ {
1724
+ "role": "user",
1725
+ "content": "What are the main principles of behavioral economics?"
1726
+ }
1727
+ ],
1728
+ [
1729
+ {
1730
+ "role": "system",
1731
+ "content": "You are a New York taxi driver from the 1980s. Be direct, opinionated, and use local slang."
1732
+ },
1733
+ {
1734
+ "role": "user",
1735
+ "content": "What do you think about the current state of the economy?"
1736
+ }
1737
+ ],
1738
+ [
1739
+ {
1740
+ "role": "user",
1741
+ "content": "How does a quantum magnetometer work?"
1742
+ }
1743
+ ],
1744
+ [
1745
+ {
1746
+ "role": "system",
1747
+ "content": "You are a character from a Hayao Miyazaki film. Be whimsical, environmentally conscious, and slightly magical."
1748
+ },
1749
+ {
1750
+ "role": "user",
1751
+ "content": "How can we protect the forest?"
1752
+ }
1753
+ ],
1754
+ [
1755
+ {
1756
+ "role": "user",
1757
+ "content": "What are the key features of solarpunk fiction and aesthetics?"
1758
+ }
1759
+ ],
1760
+ [
1761
+ {
1762
+ "role": "system",
1763
+ "content": "You are an ancient Roman senator. Speak formally and be concerned with law, rhetoric, and the good of the Republic."
1764
+ },
1765
+ {
1766
+ "role": "user",
1767
+ "content": "How should we govern our city?"
1768
+ }
1769
+ ],
1770
+ [
1771
+ {
1772
+ "role": "user",
1773
+ "content": "Explain the concept of quantum annealing in optimization problems"
1774
+ }
1775
+ ],
1776
+ [
1777
+ {
1778
+ "role": "system",
1779
+ "content": "You are a character from a Monty Python sketch. Be absurd, surreal, and prone to non sequiturs."
1780
+ },
1781
+ {
1782
+ "role": "user",
1783
+ "content": "What is the airspeed velocity of an unladen swallow?"
1784
+ }
1785
+ ],
1786
+ [
1787
+ {
1788
+ "role": "user",
1789
+ "content": "What are the main principles of regenerative ocean farming?"
1790
+ }
1791
+ ],
1792
+ [
1793
+ {
1794
+ "role": "system",
1795
+ "content": "You are a 1960s Madison Avenue advertising executive. Be smooth-talking and focus on selling ideas."
1796
+ },
1797
+ {
1798
+ "role": "user",
1799
+ "content": "How can I convince people to buy my product?"
1800
+ }
1801
+ ],
1802
+ [
1803
+ {
1804
+ "role": "user",
1805
+ "content": "How does a brain-computer interface translate thoughts into commands?"
1806
+ }
1807
+ ],
1808
+ [
1809
+ {
1810
+ "role": "system",
1811
+ "content": "You are a character from a Terry Pratchett novel. Be witty, satirical, and include elements of fantasy."
1812
+ },
1813
+ {
1814
+ "role": "user",
1815
+ "content": "Why do humans believe in gods?"
1816
+ }
1817
+ ],
1818
+ [
1819
+ {
1820
+ "role": "user",
1821
+ "content": "What are the key principles of positive psychology?"
1822
+ }
1823
+ ],
1824
+ [
1825
+ {
1826
+ "role": "system",
1827
+ "content": "You are a Victorian-era explorer. Speak enthusiastically about discoveries and use outdated scientific terms."
1828
+ },
1829
+ {
1830
+ "role": "user",
1831
+ "content": "What's beyond that mountain range?"
1832
+ }
1833
+ ],
1834
+ [
1835
+ {
1836
+ "role": "user",
1837
+ "content": "Explain the concept of quantum error correction in quantum computing"
1838
+ }
1839
+ ],
1840
+ [
1841
+ {
1842
+ "role": "system",
1843
+ "content": "You are a character from a Noel Coward play. Be witty, sophisticated, and slightly cynical."
1844
+ },
1845
+ {
1846
+ "role": "user",
1847
+ "content": "What's your opinion on modern romance?"
1848
+ }
1849
+ ]
1850
+ ]
docker/transformers-all-latest-gpu/Dockerfile ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
2
+ LABEL maintainer="Hugging Face"
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+
6
+ # Use login shell to read variables from `~/.profile` (to pass dynamic created variables between RUN commands)
7
+ SHELL ["sh", "-lc"]
8
+
9
+ # The following `ARG` are mainly used to specify the versions explicitly & directly in this docker file, and not meant
10
+ # to be used as arguments for docker build (so far).
11
+
12
+ ARG PYTORCH='2.2.1'
13
+ # (not always a valid torch version)
14
+ ARG INTEL_TORCH_EXT='2.2.0'
15
+ # Example: `cu102`, `cu113`, etc.
16
+ ARG CUDA='cu118'
17
+
18
+ RUN apt update
19
+ RUN apt install -y git libsndfile1-dev tesseract-ocr espeak-ng python3 python3-pip ffmpeg git-lfs
20
+ RUN git lfs install
21
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
22
+
23
+ ARG REF=main
24
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
25
+
26
+ # 1. Put several commands in a single `RUN` to avoid image/layer exporting issue. Could be revised in the future.
27
+ # 2. Regarding `torch` part, We might need to specify proper versions for `torchvision` and `torchaudio`.
28
+ # Currently, let's not bother to specify their versions explicitly (so installed with their latest release versions).
29
+ RUN python3 -m pip install --no-cache-dir -U tensorflow==2.13 protobuf==3.20.3 tensorflow_text tensorflow_probability && python3 -m pip install --no-cache-dir -e ./transformers[dev,onnxruntime] && [ ${#PYTORCH} -gt 0 -a "$PYTORCH" != "pre" ] && VERSION='torch=='$PYTORCH'.*' || VERSION='torch'; echo "export VERSION='$VERSION'" >> ~/.profile && echo torch=$VERSION && [ "$PYTORCH" != "pre" ] && python3 -m pip install --no-cache-dir -U $VERSION torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/$CUDA || python3 -m pip install --no-cache-dir -U --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/$CUDA
30
+
31
+ RUN python3 -m pip uninstall -y flax jax
32
+
33
+ RUN python3 -m pip install --no-cache-dir intel_extension_for_pytorch==$INTEL_TORCH_EXT -f https://developer.intel.com/ipex-whl-stable-cpu
34
+
35
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/facebookresearch/detectron2.git pytesseract
36
+ RUN python3 -m pip install -U "itsdangerous<2.1.0"
37
+
38
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/accelerate@main#egg=accelerate
39
+
40
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/peft@main#egg=peft
41
+
42
+ # For bettertransformer
43
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/optimum@main#egg=optimum
44
+
45
+ # For video model testing
46
+ RUN python3 -m pip install --no-cache-dir decord av==9.2.0
47
+
48
+ # Some slow tests require bnb
49
+ RUN python3 -m pip install --no-cache-dir bitsandbytes
50
+
51
+ # For `dinat` model
52
+ # The `XXX` part in `torchXXX` needs to match `PYTORCH` (to some extent)
53
+ RUN python3 -m pip install --no-cache-dir natten==0.15.1+torch220$CUDA -f https://shi-labs.com/natten/wheels
54
+
55
+ # For `nougat` tokenizer
56
+ RUN python3 -m pip install --no-cache-dir python-Levenshtein
57
+
58
+ # For `FastSpeech2ConformerTokenizer` tokenizer
59
+ RUN python3 -m pip install --no-cache-dir g2p-en
60
+
61
+ # When installing in editable mode, `transformers` is not recognized as a package.
62
+ # this line must be added in order for python to be aware of transformers.
63
+ RUN cd transformers && python3 setup.py develop
docker/transformers-doc-builder/Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.10
2
+ LABEL maintainer="Hugging Face"
3
+
4
+ RUN apt update
5
+ RUN git clone https://github.com/huggingface/transformers
6
+
7
+ RUN python3 -m pip install --no-cache-dir --upgrade pip && python3 -m pip install --no-cache-dir git+https://github.com/huggingface/doc-builder ./transformers[dev]
8
+ RUN apt-get -y update && apt-get install -y libsndfile1-dev && apt install -y tesseract-ocr
9
+
10
+ # Torch needs to be installed before deepspeed
11
+ RUN python3 -m pip install --no-cache-dir ./transformers[deepspeed]
12
+
13
+ RUN python3 -m pip install --no-cache-dir torchvision git+https://github.com/facebookresearch/detectron2.git pytesseract
14
+ RUN python3 -m pip install -U "itsdangerous<2.1.0"
15
+
16
+ # Test if the image could successfully build the doc. before publishing the image
17
+ RUN doc-builder build transformers transformers/docs/source/en --build_dir doc-build-dev --notebook_dir notebooks/transformers_doc --clean
18
+ RUN rm -rf doc-build-dev
docker/transformers-gpu/Dockerfile ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
2
+ LABEL maintainer="Hugging Face"
3
+ LABEL repository="transformers"
4
+
5
+ RUN apt update && \
6
+ apt install -y bash \
7
+ build-essential \
8
+ git \
9
+ curl \
10
+ ca-certificates \
11
+ python3 \
12
+ python3-pip && \
13
+ rm -rf /var/lib/apt/lists
14
+
15
+ RUN python3 -m pip install --no-cache-dir --upgrade pip && \
16
+ python3 -m pip install --no-cache-dir \
17
+ jupyter \
18
+ tensorflow \
19
+ torch
20
+
21
+ RUN git clone https://github.com/NVIDIA/apex
22
+ RUN cd apex && \
23
+ python3 setup.py install && \
24
+ pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
25
+
26
+ WORKDIR /workspace
27
+ COPY . transformers/
28
+ RUN cd transformers/ && \
29
+ python3 -m pip install --no-cache-dir .
30
+
31
+ CMD ["/bin/bash"]
docker/transformers-past-gpu/Dockerfile ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ARG BASE_DOCKER_IMAGE
2
+ FROM $BASE_DOCKER_IMAGE
3
+ LABEL maintainer="Hugging Face"
4
+
5
+ ARG DEBIAN_FRONTEND=noninteractive
6
+
7
+ # Use login shell to read variables from `~/.profile` (to pass dynamic created variables between RUN commands)
8
+ SHELL ["sh", "-lc"]
9
+
10
+ RUN apt update
11
+ RUN apt install -y git libsndfile1-dev tesseract-ocr espeak-ng python3 python3-pip ffmpeg git-lfs libaio-dev
12
+ RUN git lfs install
13
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
14
+
15
+ ARG REF=main
16
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
17
+ RUN python3 -m pip install --no-cache-dir -e ./transformers[dev,onnxruntime]
18
+
19
+ # When installing in editable mode, `transformers` is not recognized as a package.
20
+ # this line must be added in order for python to be aware of transformers.
21
+ RUN cd transformers && python3 setup.py develop
22
+
23
+ ARG FRAMEWORK
24
+ ARG VERSION
25
+
26
+ # Control `setuptools` version to avoid some issues
27
+ RUN [ "$VERSION" != "1.10" ] && python3 -m pip install -U setuptools || python3 -m pip install -U "setuptools<=59.5"
28
+
29
+ # Remove all frameworks
30
+ RUN python3 -m pip uninstall -y torch torchvision torchaudio tensorflow jax flax
31
+
32
+ # Get the libraries and their versions to install, and write installation command to `~/.profile`.
33
+ RUN python3 ./transformers/utils/past_ci_versions.py --framework $FRAMEWORK --version $VERSION
34
+
35
+ # Install the target framework
36
+ RUN echo "INSTALL_CMD = $INSTALL_CMD"
37
+ RUN $INSTALL_CMD
38
+
39
+ RUN [ "$FRAMEWORK" != "pytorch" ] && echo "`deepspeed-testing` installation is skipped" || python3 -m pip install --no-cache-dir ./transformers[deepspeed-testing]
40
+
41
+ # Remove `accelerate`: it requires `torch`, and this causes import issues for TF-only testing
42
+ # We will install `accelerate@main` in Past CI workflow file
43
+ RUN python3 -m pip uninstall -y accelerate
44
+
45
+ # Uninstall `torch-tensorrt` and `apex` shipped with the base image
46
+ RUN python3 -m pip uninstall -y torch-tensorrt apex
47
+
48
+ # Pre-build **nightly** release of DeepSpeed, so it would be ready for testing (otherwise, the 1st deepspeed test will timeout)
49
+ RUN python3 -m pip uninstall -y deepspeed
50
+ # This has to be run inside the GPU VMs running the tests. (So far, it fails here due to GPU checks during compilation.)
51
+ # Issue: https://github.com/microsoft/DeepSpeed/issues/2010
52
+ # RUN git clone https://github.com/microsoft/DeepSpeed && cd DeepSpeed && rm -rf build && \
53
+ # DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 DS_BUILD_UTILS=1 python3 -m pip install . --global-option="build_ext" --global-option="-j8" --no-cache -v --disable-pip-version-check 2>&1
54
+
55
+ RUN python3 -m pip install -U "itsdangerous<2.1.0"
56
+
57
+ # When installing in editable mode, `transformers` is not recognized as a package.
58
+ # this line must be added in order for python to be aware of transformers.
59
+ RUN cd transformers && python3 setup.py develop
docker/transformers-pytorch-amd-gpu/Dockerfile ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM rocm/dev-ubuntu-20.04:5.6
2
+ # rocm/pytorch has no version with 2.1.0
3
+ LABEL maintainer="Hugging Face"
4
+
5
+ ARG DEBIAN_FRONTEND=noninteractive
6
+
7
+ ARG PYTORCH='2.1.0'
8
+ ARG TORCH_VISION='0.16.0'
9
+ ARG TORCH_AUDIO='2.1.0'
10
+ ARG ROCM='5.6'
11
+
12
+ RUN apt update && \
13
+ apt install -y --no-install-recommends git libsndfile1-dev tesseract-ocr espeak-ng python3 python3-dev python3-pip ffmpeg && \
14
+ apt clean && \
15
+ rm -rf /var/lib/apt/lists/*
16
+
17
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
18
+
19
+ RUN python3 -m pip install torch==$PYTORCH torchvision==$TORCH_VISION torchaudio==$TORCH_AUDIO --index-url https://download.pytorch.org/whl/rocm$ROCM
20
+
21
+ RUN python3 -m pip install --no-cache-dir --upgrade pip setuptools ninja git+https://github.com/facebookresearch/detectron2.git pytesseract "itsdangerous<2.1.0"
22
+
23
+ ARG REF=main
24
+ WORKDIR /
25
+
26
+ # Invalidate docker cache from here if new commit is available.
27
+ ADD https://api.github.com/repos/huggingface/transformers/git/refs/heads/main version.json
28
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
29
+
30
+ RUN python3 -m pip install --no-cache-dir -e ./transformers[dev-torch,testing,video]
31
+
32
+ RUN python3 -m pip uninstall -y tensorflow flax
33
+
34
+ # When installing in editable mode, `transformers` is not recognized as a package.
35
+ # this line must be added in order for python to be aware of transformers.
36
+ RUN cd transformers && python3 setup.py develop
37
+
38
+ # Remove nvml as it is not compatible with ROCm
39
+ RUN python3 -m pip uninstall py3nvml pynvml -y
docker/transformers-pytorch-deepspeed-amd-gpu/Dockerfile ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM rocm/dev-ubuntu-22.04:5.6
2
+ LABEL maintainer="Hugging Face"
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+ ARG PYTORCH='2.1.1'
6
+ ARG TORCH_VISION='0.16.1'
7
+ ARG TORCH_AUDIO='2.1.1'
8
+ ARG ROCM='5.6'
9
+
10
+ RUN apt update && \
11
+ apt install -y --no-install-recommends \
12
+ libaio-dev \
13
+ git \
14
+ # These are required to build deepspeed.
15
+ python3-dev \
16
+ python-is-python3 \
17
+ rocrand-dev \
18
+ rocthrust-dev \
19
+ hipsparse-dev \
20
+ hipblas-dev \
21
+ rocblas-dev && \
22
+ apt clean && \
23
+ rm -rf /var/lib/apt/lists/*
24
+
25
+ RUN python3 -m pip install --no-cache-dir --upgrade pip ninja "pydantic<2"
26
+ RUN python3 -m pip uninstall -y apex torch torchvision torchaudio
27
+ RUN python3 -m pip install torch==$PYTORCH torchvision==$TORCH_VISION torchaudio==$TORCH_AUDIO --index-url https://download.pytorch.org/whl/rocm$ROCM --no-cache-dir
28
+
29
+ # Pre-build DeepSpeed, so it's be ready for testing (to avoid timeout)
30
+ RUN DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 python3 -m pip install deepspeed --global-option="build_ext" --global-option="-j8" --no-cache-dir -v --disable-pip-version-check 2>&1
31
+
32
+ ARG REF=main
33
+ WORKDIR /
34
+
35
+ # Invalidate docker cache from here if new commit is available.
36
+ ADD https://api.github.com/repos/huggingface/transformers/git/refs/heads/main version.json
37
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
38
+
39
+ RUN python3 -m pip install --no-cache-dir ./transformers[accelerate,testing,sentencepiece,sklearn]
40
+
41
+ # When installing in editable mode, `transformers` is not recognized as a package.
42
+ # this line must be added in order for python to be aware of transformers.
43
+ RUN cd transformers && python3 setup.py develop
44
+
45
+ RUN python3 -c "from deepspeed.launcher.runner import main"
46
+
47
+ # Remove nvml as it is not compatible with ROCm
48
+ RUN python3 -m pip uninstall py3nvml pynvml -y
docker/transformers-pytorch-deepspeed-latest-gpu/Dockerfile ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/rel-23-11.html#rel-23-11
2
+ FROM nvcr.io/nvidia/pytorch:23.04-py3
3
+ LABEL maintainer="Hugging Face"
4
+
5
+ ARG DEBIAN_FRONTEND=noninteractive
6
+
7
+ ARG PYTORCH='2.2.0'
8
+ # Example: `cu102`, `cu113`, etc.
9
+ ARG CUDA='cu121'
10
+
11
+ RUN apt -y update
12
+ RUN apt install -y libaio-dev
13
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
14
+
15
+ ARG REF=main
16
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
17
+
18
+ RUN python3 -m pip install --no-cache-dir ./transformers[deepspeed-testing]
19
+
20
+ # Install latest release PyTorch
21
+ # (PyTorch must be installed before pre-compiling any DeepSpeed c++/cuda ops.)
22
+ # (https://www.deepspeed.ai/tutorials/advanced-install/#pre-install-deepspeed-ops)
23
+ RUN python3 -m pip uninstall -y torch torchvision torchaudio && python3 -m pip install --no-cache-dir -U torch==$PYTORCH torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/$CUDA
24
+
25
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/accelerate@main#egg=accelerate
26
+
27
+ # Uninstall `transformer-engine` shipped with the base image
28
+ RUN python3 -m pip uninstall -y transformer-engine
29
+
30
+ # Uninstall `torch-tensorrt` shipped with the base image
31
+ RUN python3 -m pip uninstall -y torch-tensorrt
32
+
33
+ # recompile apex
34
+ RUN python3 -m pip uninstall -y apex
35
+ # RUN git clone https://github.com/NVIDIA/apex
36
+ # `MAX_JOBS=1` disables parallel building to avoid cpu memory OOM when building image on GitHub Action (standard) runners
37
+ # TODO: check if there is alternative way to install latest apex
38
+ # RUN cd apex && MAX_JOBS=1 python3 -m pip install --global-option="--cpp_ext" --global-option="--cuda_ext" --no-cache -v --disable-pip-version-check .
39
+
40
+ # Pre-build **latest** DeepSpeed, so it would be ready for testing (otherwise, the 1st deepspeed test will timeout)
41
+ RUN python3 -m pip uninstall -y deepspeed
42
+ # This has to be run (again) inside the GPU VMs running the tests.
43
+ # The installation works here, but some tests fail, if we don't pre-build deepspeed again in the VMs running the tests.
44
+ # TODO: Find out why test fail.
45
+ RUN DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 python3 -m pip install deepspeed --global-option="build_ext" --global-option="-j8" --no-cache -v --disable-pip-version-check 2>&1
46
+
47
+ # When installing in editable mode, `transformers` is not recognized as a package.
48
+ # this line must be added in order for python to be aware of transformers.
49
+ RUN cd transformers && python3 setup.py develop
50
+
51
+ # The base image ships with `pydantic==1.8.2` which is not working - i.e. the next command fails
52
+ RUN python3 -m pip install -U --no-cache-dir "pydantic<2"
53
+ RUN python3 -c "from deepspeed.launcher.runner import main"
docker/transformers-pytorch-deepspeed-nightly-gpu/Dockerfile ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/rel-23-11.html#rel-23-11
2
+ FROM nvcr.io/nvidia/pytorch:23.11-py3
3
+ LABEL maintainer="Hugging Face"
4
+
5
+ ARG DEBIAN_FRONTEND=noninteractive
6
+
7
+ # Example: `cu102`, `cu113`, etc.
8
+ ARG CUDA='cu121'
9
+
10
+ RUN apt -y update
11
+ RUN apt install -y libaio-dev
12
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
13
+
14
+ ARG REF=main
15
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
16
+
17
+ RUN python3 -m pip uninstall -y torch torchvision torchaudio
18
+
19
+ # Install **nightly** release PyTorch (flag `--pre`)
20
+ # (PyTorch must be installed before pre-compiling any DeepSpeed c++/cuda ops.)
21
+ # (https://www.deepspeed.ai/tutorials/advanced-install/#pre-install-deepspeed-ops)
22
+ RUN python3 -m pip install --no-cache-dir -U --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/$CUDA
23
+
24
+ RUN python3 -m pip install --no-cache-dir ./transformers[deepspeed-testing]
25
+
26
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/accelerate@main#egg=accelerate
27
+
28
+ # Uninstall `transformer-engine` shipped with the base image
29
+ RUN python3 -m pip uninstall -y transformer-engine
30
+
31
+ # Uninstall `torch-tensorrt` and `apex` shipped with the base image
32
+ RUN python3 -m pip uninstall -y torch-tensorrt apex
33
+
34
+ # Pre-build **nightly** release of DeepSpeed, so it would be ready for testing (otherwise, the 1st deepspeed test will timeout)
35
+ RUN python3 -m pip uninstall -y deepspeed
36
+ # This has to be run inside the GPU VMs running the tests. (So far, it fails here due to GPU checks during compilation.)
37
+ # Issue: https://github.com/microsoft/DeepSpeed/issues/2010
38
+ # RUN git clone https://github.com/microsoft/DeepSpeed && cd DeepSpeed && rm -rf build && \
39
+ # DS_BUILD_CPU_ADAM=1 DS_BUILD_FUSED_ADAM=1 DS_BUILD_UTILS=1 python3 -m pip install . --global-option="build_ext" --global-option="-j8" --no-cache -v --disable-pip-version-check 2>&1
40
+
41
+ ## For `torchdynamo` tests
42
+ ## (see https://github.com/huggingface/transformers/pull/17765)
43
+ #RUN git clone https://github.com/pytorch/functorch
44
+ #RUN python3 -m pip install --no-cache-dir ./functorch[aot]
45
+ #RUN cd functorch && python3 setup.py develop
46
+ #
47
+ #RUN git clone https://github.com/pytorch/torchdynamo
48
+ #RUN python3 -m pip install -r ./torchdynamo/requirements.txt
49
+ #RUN cd torchdynamo && python3 setup.py develop
50
+ #
51
+ ## install TensorRT
52
+ #RUN python3 -m pip install --no-cache-dir -U nvidia-pyindex
53
+ #RUN python3 -m pip install --no-cache-dir -U nvidia-tensorrt==8.2.4.2
54
+ #
55
+ ## install torch_tensorrt (fx path)
56
+ #RUN git clone https://github.com/pytorch/TensorRT.git
57
+ #RUN cd TensorRT/py && python3 setup.py install --fx-only
58
+
59
+ # When installing in editable mode, `transformers` is not recognized as a package.
60
+ # this line must be added in order for python to be aware of transformers.
61
+ RUN cd transformers && python3 setup.py develop
62
+
63
+ # Disable for now as deepspeed is not installed above. To be enabled once the issue is fixed.
64
+ # RUN python3 -c "from deepspeed.launcher.runner import main"
docker/transformers-pytorch-gpu/Dockerfile ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu20.04
2
+ LABEL maintainer="Hugging Face"
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+
6
+ RUN apt update
7
+ RUN apt install -y git libsndfile1-dev tesseract-ocr espeak-ng python3 python3-pip ffmpeg
8
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
9
+
10
+ ARG REF=main
11
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
12
+
13
+ # If set to nothing, will install the latest version
14
+ ARG PYTORCH='2.1.1'
15
+ ARG TORCH_VISION=''
16
+ ARG TORCH_AUDIO=''
17
+ # Example: `cu102`, `cu113`, etc.
18
+ ARG CUDA='cu121'
19
+
20
+ RUN [ ${#PYTORCH} -gt 0 ] && VERSION='torch=='$PYTORCH'.*' || VERSION='torch'; python3 -m pip install --no-cache-dir -U $VERSION --extra-index-url https://download.pytorch.org/whl/$CUDA
21
+ RUN [ ${#TORCH_VISION} -gt 0 ] && VERSION='torchvision=='TORCH_VISION'.*' || VERSION='torchvision'; python3 -m pip install --no-cache-dir -U $VERSION --extra-index-url https://download.pytorch.org/whl/$CUDA
22
+ RUN [ ${#TORCH_AUDIO} -gt 0 ] && VERSION='torchaudio=='TORCH_AUDIO'.*' || VERSION='torchaudio'; python3 -m pip install --no-cache-dir -U $VERSION --extra-index-url https://download.pytorch.org/whl/$CUDA
23
+
24
+ RUN python3 -m pip install --no-cache-dir -e ./transformers[dev-torch,testing,video]
25
+
26
+ RUN python3 -m pip uninstall -y tensorflow flax
27
+
28
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/facebookresearch/detectron2.git pytesseract
29
+ RUN python3 -m pip install -U "itsdangerous<2.1.0"
30
+
31
+ # When installing in editable mode, `transformers` is not recognized as a package.
32
+ # this line must be added in order for python to be aware of transformers.
33
+ RUN cd transformers && python3 setup.py develop
docker/transformers-pytorch-tpu/Dockerfile ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM google/cloud-sdk:slim
2
+
3
+ # Build args.
4
+ ARG GITHUB_REF=refs/heads/main
5
+
6
+ # TODO: This Dockerfile installs pytorch/xla 3.6 wheels. There are also 3.7
7
+ # wheels available; see below.
8
+ ENV PYTHON_VERSION=3.6
9
+
10
+ RUN apt-get update && apt-get install -y --no-install-recommends \
11
+ build-essential \
12
+ cmake \
13
+ git \
14
+ curl \
15
+ ca-certificates
16
+
17
+ # Install conda and python.
18
+ # NOTE new Conda does not forward the exit status... https://github.com/conda/conda/issues/8385
19
+ RUN curl -o ~/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-Linux-x86_64.sh && \
20
+ chmod +x ~/miniconda.sh && \
21
+ ~/miniconda.sh -b && \
22
+ rm ~/miniconda.sh
23
+
24
+ ENV PATH=/root/miniconda3/bin:$PATH
25
+
26
+ RUN conda create -y --name container python=$PYTHON_VERSION
27
+
28
+ # Run the rest of commands within the new conda env.
29
+ # Use absolute path to appease Codefactor.
30
+ SHELL ["/root/miniconda3/bin/conda", "run", "-n", "container", "/bin/bash", "-c"]
31
+ RUN conda install -y python=$PYTHON_VERSION mkl
32
+
33
+ RUN pip uninstall -y torch && \
34
+ # Python 3.7 wheels are available. Replace cp36-cp36m with cp37-cp37m
35
+ gsutil cp 'gs://tpu-pytorch/wheels/torch-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' . && \
36
+ gsutil cp 'gs://tpu-pytorch/wheels/torch_xla-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' . && \
37
+ gsutil cp 'gs://tpu-pytorch/wheels/torchvision-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' . && \
38
+ pip install 'torch-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' && \
39
+ pip install 'torch_xla-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' && \
40
+ pip install 'torchvision-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' && \
41
+ rm 'torch-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' && \
42
+ rm 'torch_xla-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' && \
43
+ rm 'torchvision-nightly-cp${PYTHON_VERSION/./}-cp${PYTHON_VERSION/./}m-linux_x86_64.whl' && \
44
+ apt-get install -y libomp5
45
+
46
+ ENV LD_LIBRARY_PATH=root/miniconda3/envs/container/lib
47
+
48
+
49
+ # Install huggingface/transformers at the current PR, plus dependencies.
50
+ RUN git clone https://github.com/huggingface/transformers.git && \
51
+ cd transformers && \
52
+ git fetch origin $GITHUB_REF:CI && \
53
+ git checkout CI && \
54
+ cd .. && \
55
+ pip install ./transformers && \
56
+ pip install -r ./transformers/examples/pytorch/_test_requirements.txt && \
57
+ pip install pytest
58
+
59
+ RUN python -c "import torch_xla; print(torch_xla.__version__)"
60
+ RUN python -c "import transformers as trf; print(trf.__version__)"
61
+ RUN conda init bash
62
+ COPY docker-entrypoint.sh /usr/local/bin/
63
+ RUN chmod +x /usr/local/bin/docker-entrypoint.sh
64
+ ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
65
+ CMD ["bash"]
docker/transformers-pytorch-tpu/bert-base-cased.jsonnet ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ local base = import 'templates/base.libsonnet';
2
+ local tpus = import 'templates/tpus.libsonnet';
3
+ local utils = import "templates/utils.libsonnet";
4
+ local volumes = import "templates/volumes.libsonnet";
5
+
6
+ local bertBaseCased = base.BaseTest {
7
+ frameworkPrefix: "hf",
8
+ modelName: "bert-base-cased",
9
+ mode: "example",
10
+ configMaps: [],
11
+
12
+ timeout: 3600, # 1 hour, in seconds
13
+
14
+ image: std.extVar('image'),
15
+ imageTag: std.extVar('image-tag'),
16
+
17
+ tpuSettings+: {
18
+ softwareVersion: "pytorch-nightly",
19
+ },
20
+ accelerator: tpus.v3_8,
21
+
22
+ volumeMap+: {
23
+ datasets: volumes.PersistentVolumeSpec {
24
+ name: "huggingface-cluster-disk",
25
+ mountPath: "/datasets",
26
+ },
27
+ },
28
+ command: utils.scriptCommand(
29
+ |||
30
+ python -m pytest -s transformers/examples/pytorch/test_xla_examples.py -v
31
+ test_exit_code=$?
32
+ echo "\nFinished running commands.\n"
33
+ test $test_exit_code -eq 0
34
+ |||
35
+ ),
36
+ };
37
+
38
+ bertBaseCased.oneshotJob
docker/transformers-pytorch-tpu/dataset.yaml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ apiVersion: v1
2
+ kind: PersistentVolume
3
+ metadata:
4
+ name: huggingface-cluster-disk
5
+ spec:
6
+ storageClassName: ""
7
+ capacity:
8
+ storage: 500Gi
9
+ accessModes:
10
+ - ReadOnlyMany
11
+ claimRef:
12
+ namespace: default
13
+ name: huggingface-cluster-disk-claim
14
+ gcePersistentDisk:
15
+ pdName: huggingface-cluster-disk
16
+ fsType: ext4
17
+ readOnly: true
18
+ ---
19
+ apiVersion: v1
20
+ kind: PersistentVolumeClaim
21
+ metadata:
22
+ name: huggingface-cluster-disk-claim
23
+ spec:
24
+ # Specify "" as the storageClassName so it matches the PersistentVolume's StorageClass.
25
+ # A nil storageClassName value uses the default StorageClass. For details, see
26
+ # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
27
+ storageClassName: ""
28
+ accessModes:
29
+ - ReadOnlyMany
30
+ resources:
31
+ requests:
32
+ storage: 1Ki
docker/transformers-pytorch-tpu/docker-entrypoint.sh ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ source ~/.bashrc
3
+ echo "running docker-entrypoint.sh"
4
+ conda activate container
5
+ echo $KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS
6
+ echo "printed TPU info"
7
+ export XRT_TPU_CONFIG="tpu_worker;0;${KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS:7}"
8
+ exec "$@"#!/bin/bash
docker/transformers-quantization-latest-gpu/Dockerfile ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
2
+ LABEL maintainer="Hugging Face"
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+
6
+ # Use login shell to read variables from `~/.profile` (to pass dynamic created variables between RUN commands)
7
+ SHELL ["sh", "-lc"]
8
+
9
+ # The following `ARG` are mainly used to specify the versions explicitly & directly in this docker file, and not meant
10
+ # to be used as arguments for docker build (so far).
11
+
12
+ ARG PYTORCH='2.2.1'
13
+ # Example: `cu102`, `cu113`, etc.
14
+ ARG CUDA='cu118'
15
+
16
+ RUN apt update
17
+ RUN apt install -y git libsndfile1-dev tesseract-ocr espeak-ng python python3-pip ffmpeg
18
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
19
+
20
+ ARG REF=main
21
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
22
+
23
+ RUN [ ${#PYTORCH} -gt 0 ] && VERSION='torch=='$PYTORCH'.*' || VERSION='torch'; echo "export VERSION='$VERSION'" >> ~/.profile
24
+ RUN echo torch=$VERSION
25
+ # `torchvision` and `torchaudio` should be installed along with `torch`, especially for nightly build.
26
+ # Currently, let's just use their latest releases (when `torch` is installed with a release version)
27
+ RUN python3 -m pip install --no-cache-dir -U $VERSION torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/$CUDA
28
+
29
+ RUN python3 -m pip install --no-cache-dir -e ./transformers[dev-torch]
30
+
31
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/accelerate@main#egg=accelerate
32
+
33
+ # needed in bnb and awq
34
+ RUN python3 -m pip install --no-cache-dir einops
35
+
36
+ # Add bitsandbytes for mixed int8 testing
37
+ RUN python3 -m pip install --no-cache-dir bitsandbytes
38
+
39
+ # Add auto-gptq for gtpq quantization testing
40
+ RUN python3 -m pip install --no-cache-dir auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/
41
+
42
+ # Add optimum for gptq quantization testing
43
+ RUN python3 -m pip install --no-cache-dir git+https://github.com/huggingface/optimum@main#egg=optimum
44
+
45
+ # Add aqlm for quantization testing
46
+ RUN python3 -m pip install --no-cache-dir aqlm[gpu]==1.0.2
47
+
48
+ # Add autoawq for quantization testing
49
+ # >=v0.2.3 needed for compatibility with torch 2.2.1
50
+ RUN python3 -m pip install --no-cache-dir https://github.com/casper-hansen/AutoAWQ/releases/download/v0.2.3/autoawq-0.2.3+cu118-cp38-cp38-linux_x86_64.whl
51
+
52
+ # Add quanto for quantization testing
53
+ RUN python3 -m pip install --no-cache-dir quanto
54
+
55
+ # Add eetq for quantization testing
56
+ RUN python3 -m pip install git+https://github.com/NetEase-FuXi/EETQ.git
57
+
58
+ # When installing in editable mode, `transformers` is not recognized as a package.
59
+ # this line must be added in order for python to be aware of transformers.
60
+ RUN cd transformers && python3 setup.py develop
docker/transformers-tensorflow-gpu/Dockerfile ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04
2
+ LABEL maintainer="Hugging Face"
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+
6
+ RUN apt update
7
+ RUN apt install -y git libsndfile1-dev tesseract-ocr espeak-ng python3 python3-pip ffmpeg
8
+ RUN python3 -m pip install --no-cache-dir --upgrade pip
9
+
10
+ ARG REF=main
11
+ RUN git clone https://github.com/huggingface/transformers && cd transformers && git checkout $REF
12
+ RUN python3 -m pip install --no-cache-dir -e ./transformers[dev-tensorflow,testing]
13
+
14
+ # If set to nothing, will install the latest version
15
+ ARG TENSORFLOW='2.13'
16
+
17
+ RUN [ ${#TENSORFLOW} -gt 0 ] && VERSION='tensorflow=='$TENSORFLOW'.*' || VERSION='tensorflow'; python3 -m pip install --no-cache-dir -U $VERSION
18
+ RUN python3 -m pip uninstall -y torch flax
19
+ RUN python3 -m pip install -U "itsdangerous<2.1.0"
20
+
21
+ RUN python3 -m pip install --no-cache-dir -U tensorflow_probability
22
+
23
+ # When installing in editable mode, `transformers` is not recognized as a package.
24
+ # this line must be added in order for python to be aware of transformers.
25
+ RUN cd transformers && python3 setup.py develop
docs/README.md ADDED
@@ -0,0 +1,397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2020 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ -->
16
+
17
+ # Generating the documentation
18
+
19
+ To generate the documentation, you first have to build it. Several packages are necessary to build the doc,
20
+ you can install them with the following command, at the root of the code repository:
21
+
22
+ ```bash
23
+ pip install -e ".[docs]"
24
+ ```
25
+
26
+ Then you need to install our special tool that builds the documentation:
27
+
28
+ ```bash
29
+ pip install git+https://github.com/huggingface/doc-builder
30
+ ```
31
+
32
+ ---
33
+ **NOTE**
34
+
35
+ You only need to generate the documentation to inspect it locally (if you're planning changes and want to
36
+ check how they look before committing for instance). You don't have to commit the built documentation.
37
+
38
+ ---
39
+
40
+ ## Building the documentation
41
+
42
+ Once you have setup the `doc-builder` and additional packages, you can generate the documentation by
43
+ typing the following command:
44
+
45
+ ```bash
46
+ doc-builder build transformers docs/source/en/ --build_dir ~/tmp/test-build
47
+ ```
48
+
49
+ You can adapt the `--build_dir` to set any temporary folder that you prefer. This command will create it and generate
50
+ the MDX files that will be rendered as the documentation on the main website. You can inspect them in your favorite
51
+ Markdown editor.
52
+
53
+ ## Previewing the documentation
54
+
55
+ To preview the docs, first install the `watchdog` module with:
56
+
57
+ ```bash
58
+ pip install watchdog
59
+ ```
60
+
61
+ Then run the following command:
62
+
63
+ ```bash
64
+ doc-builder preview {package_name} {path_to_docs}
65
+ ```
66
+
67
+ For example:
68
+
69
+ ```bash
70
+ doc-builder preview transformers docs/source/en/
71
+ ```
72
+
73
+ The docs will be viewable at [http://localhost:3000](http://localhost:3000). You can also preview the docs once you have opened a PR. You will see a bot add a comment to a link where the documentation with your changes lives.
74
+
75
+ ---
76
+ **NOTE**
77
+
78
+ The `preview` command only works with existing doc files. When you add a completely new file, you need to update `_toctree.yml` & restart `preview` command (`ctrl-c` to stop it & call `doc-builder preview ...` again).
79
+
80
+ ---
81
+
82
+ ## Adding a new element to the navigation bar
83
+
84
+ Accepted files are Markdown (.md).
85
+
86
+ Create a file with its extension and put it in the source directory. You can then link it to the toc-tree by putting
87
+ the filename without the extension in the [`_toctree.yml`](https://github.com/huggingface/transformers/blob/main/docs/source/en/_toctree.yml) file.
88
+
89
+ ## Renaming section headers and moving sections
90
+
91
+ It helps to keep the old links working when renaming the section header and/or moving sections from one document to another. This is because the old links are likely to be used in Issues, Forums, and Social media and it'd make for a much more superior user experience if users reading those months later could still easily navigate to the originally intended information.
92
+
93
+ Therefore, we simply keep a little map of moved sections at the end of the document where the original section was. The key is to preserve the original anchor.
94
+
95
+ So if you renamed a section from: "Section A" to "Section B", then you can add at the end of the file:
96
+
97
+ ```
98
+ Sections that were moved:
99
+
100
+ [ <a href="#section-b">Section A</a><a id="section-a"></a> ]
101
+ ```
102
+ and of course, if you moved it to another file, then:
103
+
104
+ ```
105
+ Sections that were moved:
106
+
107
+ [ <a href="../new-file#section-b">Section A</a><a id="section-a"></a> ]
108
+ ```
109
+
110
+ Use the relative style to link to the new file so that the versioned docs continue to work.
111
+
112
+ For an example of a rich moved section set please see the very end of [the Trainer doc](https://github.com/huggingface/transformers/blob/main/docs/source/en/main_classes/trainer.md).
113
+
114
+
115
+ ## Writing Documentation - Specification
116
+
117
+ The `huggingface/transformers` documentation follows the
118
+ [Google documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) style for docstrings,
119
+ although we can write them directly in Markdown.
120
+
121
+ ### Adding a new tutorial
122
+
123
+ Adding a new tutorial or section is done in two steps:
124
+
125
+ - Add a new file under `./source`. This file can either be ReStructuredText (.rst) or Markdown (.md).
126
+ - Link that file in `./source/_toctree.yml` on the correct toc-tree.
127
+
128
+ Make sure to put your new file under the proper section. It's unlikely to go in the first section (*Get Started*), so
129
+ depending on the intended targets (beginners, more advanced users, or researchers) it should go in sections two, three, or
130
+ four.
131
+
132
+ ### Translating
133
+
134
+ When translating, refer to the guide at [./TRANSLATING.md](https://github.com/huggingface/transformers/blob/main/docs/TRANSLATING.md).
135
+
136
+
137
+ ### Adding a new model
138
+
139
+ When adding a new model:
140
+
141
+ - Create a file `xxx.md` or under `./source/model_doc` (don't hesitate to copy an existing file as template).
142
+ - Link that file in `./source/_toctree.yml`.
143
+ - Write a short overview of the model:
144
+ - Overview with paper & authors
145
+ - Paper abstract
146
+ - Tips and tricks and how to use it best
147
+ - Add the classes that should be linked in the model. This generally includes the configuration, the tokenizer, and
148
+ every model of that class (the base model, alongside models with additional heads), both in PyTorch and TensorFlow.
149
+ The order is generally:
150
+ - Configuration
151
+ - Tokenizer
152
+ - PyTorch base model
153
+ - PyTorch head models
154
+ - TensorFlow base model
155
+ - TensorFlow head models
156
+ - Flax base model
157
+ - Flax head models
158
+
159
+ These classes should be added using our Markdown syntax. Usually as follows:
160
+
161
+ ```
162
+ ## XXXConfig
163
+
164
+ [[autodoc]] XXXConfig
165
+ ```
166
+
167
+ This will include every public method of the configuration that is documented. If for some reason you wish for a method
168
+ not to be displayed in the documentation, you can do so by specifying which methods should be in the docs:
169
+
170
+ ```
171
+ ## XXXTokenizer
172
+
173
+ [[autodoc]] XXXTokenizer
174
+ - build_inputs_with_special_tokens
175
+ - get_special_tokens_mask
176
+ - create_token_type_ids_from_sequences
177
+ - save_vocabulary
178
+ ```
179
+
180
+ If you just want to add a method that is not documented (for instance magic methods like `__call__` are not documented
181
+ by default) you can put the list of methods to add in a list that contains `all`:
182
+
183
+ ```
184
+ ## XXXTokenizer
185
+
186
+ [[autodoc]] XXXTokenizer
187
+ - all
188
+ - __call__
189
+ ```
190
+
191
+ ### Writing source documentation
192
+
193
+ Values that should be put in `code` should either be surrounded by backticks: \`like so\`. Note that argument names
194
+ and objects like True, None, or any strings should usually be put in `code`.
195
+
196
+ When mentioning a class, function, or method, it is recommended to use our syntax for internal links so that our tool
197
+ adds a link to its documentation with this syntax: \[\`XXXClass\`\] or \[\`function\`\]. This requires the class or
198
+ function to be in the main package.
199
+
200
+ If you want to create a link to some internal class or function, you need to
201
+ provide its path. For instance: \[\`utils.ModelOutput\`\]. This will be converted into a link with
202
+ `utils.ModelOutput` in the description. To get rid of the path and only keep the name of the object you are
203
+ linking to in the description, add a ~: \[\`~utils.ModelOutput\`\] will generate a link with `ModelOutput` in the description.
204
+
205
+ The same works for methods so you can either use \[\`XXXClass.method\`\] or \[\`~XXXClass.method\`\].
206
+
207
+ #### Defining arguments in a method
208
+
209
+ Arguments should be defined with the `Args:` (or `Arguments:` or `Parameters:`) prefix, followed by a line return and
210
+ an indentation. The argument should be followed by its type, with its shape if it is a tensor, a colon, and its
211
+ description:
212
+
213
+ ```
214
+ Args:
215
+ n_layers (`int`): The number of layers of the model.
216
+ ```
217
+
218
+ If the description is too long to fit in one line, another indentation is necessary before writing the description
219
+ after the argument.
220
+
221
+ Here's an example showcasing everything so far:
222
+
223
+ ```
224
+ Args:
225
+ input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
226
+ Indices of input sequence tokens in the vocabulary.
227
+
228
+ Indices can be obtained using [`AlbertTokenizer`]. See [`~PreTrainedTokenizer.encode`] and
229
+ [`~PreTrainedTokenizer.__call__`] for details.
230
+
231
+ [What are input IDs?](../glossary#input-ids)
232
+ ```
233
+
234
+ For optional arguments or arguments with defaults we follow the following syntax: imagine we have a function with the
235
+ following signature:
236
+
237
+ ```
238
+ def my_function(x: str = None, a: float = 1):
239
+ ```
240
+
241
+ then its documentation should look like this:
242
+
243
+ ```
244
+ Args:
245
+ x (`str`, *optional*):
246
+ This argument controls ...
247
+ a (`float`, *optional*, defaults to 1):
248
+ This argument is used to ...
249
+ ```
250
+
251
+ Note that we always omit the "defaults to \`None\`" when None is the default for any argument. Also note that even
252
+ if the first line describing your argument type and its default gets long, you can't break it on several lines. You can
253
+ however, write as many lines as you want in the indented description (see the example above with `input_ids`).
254
+
255
+ #### Writing a multi-line code block
256
+
257
+ Multi-line code blocks can be useful for displaying examples. They are done between two lines of three backticks as usual in Markdown:
258
+
259
+
260
+ ````
261
+ ```
262
+ # first line of code
263
+ # second line
264
+ # etc
265
+ ```
266
+ ````
267
+
268
+ We follow the [doctest](https://docs.python.org/3/library/doctest.html) syntax for the examples to automatically test
269
+ the results to stay consistent with the library.
270
+
271
+ #### Writing a return block
272
+
273
+ The return block should be introduced with the `Returns:` prefix, followed by a line return and an indentation.
274
+ The first line should be the type of the return, followed by a line return. No need to indent further for the elements
275
+ building the return.
276
+
277
+ Here's an example of a single value return:
278
+
279
+ ```
280
+ Returns:
281
+ `List[int]`: A list of integers in the range [0, 1] --- 1 for a special token, 0 for a sequence token.
282
+ ```
283
+
284
+ Here's an example of a tuple return, comprising several objects:
285
+
286
+ ```
287
+ Returns:
288
+ `tuple(torch.FloatTensor)` comprising various elements depending on the configuration ([`BertConfig`]) and inputs:
289
+ - ** loss** (*optional*, returned when `masked_lm_labels` is provided) `torch.FloatTensor` of shape `(1,)` --
290
+ Total loss is the sum of the masked language modeling loss and the next sequence prediction (classification) loss.
291
+ - **prediction_scores** (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`) --
292
+ Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
293
+ ```
294
+
295
+ #### Adding an image
296
+
297
+ Due to the rapidly growing repository, it is important to make sure that no files that would significantly weigh down the repository are added. This includes images, videos, and other non-text files. We prefer to leverage a hf.co hosted `dataset` like
298
+ the ones hosted on [`hf-internal-testing`](https://huggingface.co/hf-internal-testing) in which to place these files and reference
299
+ them by URL. We recommend putting them in the following dataset: [huggingface/documentation-images](https://huggingface.co/datasets/huggingface/documentation-images).
300
+ If an external contribution, feel free to add the images to your PR and ask a Hugging Face member to migrate your images
301
+ to this dataset.
302
+
303
+ ## Styling the docstring
304
+
305
+ We have an automatic script running with the `make style` comment that will make sure that:
306
+ - the docstrings fully take advantage of the line width
307
+ - all code examples are formatted using black, like the code of the Transformers library
308
+
309
+ This script may have some weird failures if you made a syntax mistake or if you uncover a bug. Therefore, it's
310
+ recommended to commit your changes before running `make style`, so you can revert the changes done by that script
311
+ easily.
312
+
313
+ # Testing documentation examples
314
+
315
+ Good documentation often comes with an example of how a specific function or class should be used.
316
+ Each model class should contain at least one example showcasing
317
+ how to use this model class in inference. *E.g.* the class [Wav2Vec2ForCTC](https://huggingface.co/docs/transformers/model_doc/wav2vec2#transformers.Wav2Vec2ForCTC)
318
+ includes an example of how to transcribe speech to text in the
319
+ [docstring of its forward function](https://huggingface.co/docs/transformers/model_doc/wav2vec2#transformers.Wav2Vec2ForCTC.forward).
320
+
321
+ ## Writing documentation examples
322
+
323
+ The syntax for Example docstrings can look as follows:
324
+
325
+ ```
326
+ Example:
327
+
328
+ ```python
329
+ >>> from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC
330
+ >>> from datasets import load_dataset
331
+ >>> import torch
332
+
333
+ >>> dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation")
334
+ >>> dataset = dataset.sort("id")
335
+ >>> sampling_rate = dataset.features["audio"].sampling_rate
336
+
337
+ >>> processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
338
+ >>> model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")
339
+
340
+ >>> # audio file is decoded on the fly
341
+ >>> inputs = processor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
342
+ >>> with torch.no_grad():
343
+ ... logits = model(**inputs).logits
344
+ >>> predicted_ids = torch.argmax(logits, dim=-1)
345
+
346
+ >>> # transcribe speech
347
+ >>> transcription = processor.batch_decode(predicted_ids)
348
+ >>> transcription[0]
349
+ 'MISTER QUILTER IS THE APOSTLE OF THE MIDDLE CLASSES AND WE ARE GLAD TO WELCOME HIS GOSPEL'
350
+ ```
351
+ ```
352
+
353
+ The docstring should give a minimal, clear example of how the respective model
354
+ is to be used in inference and also include the expected (ideally sensible)
355
+ output.
356
+ Often, readers will try out the example before even going through the function
357
+ or class definitions. Therefore, it is of utmost importance that the example
358
+ works as expected.
359
+
360
+ ## Docstring testing
361
+
362
+ To do so each example should be included in the doctests.
363
+ We use pytests' [doctest integration](https://docs.pytest.org/doctest.html) to verify that all of our examples run correctly.
364
+ For Transformers, the doctests are run on a daily basis via GitHub Actions as can be
365
+ seen [here](https://github.com/huggingface/transformers/actions/workflows/doctests.yml).
366
+
367
+ ### For Python files
368
+
369
+ Run all the tests in the docstrings of a given file with the following command, here is how we test the modeling file of Wav2Vec2 for instance:
370
+
371
+ ```bash
372
+ pytest --doctest-modules src/transformers/models/wav2vec2/modeling_wav2vec2.py -sv --doctest-continue-on-failure
373
+ ```
374
+
375
+ If you want to isolate a specific docstring, just add `::` after the file name then type the whole path of the function/class/method whose docstring you want to test. For instance, here is how to just test the forward method of `Wav2Vec2ForCTC`:
376
+
377
+ ```bash
378
+ pytest --doctest-modules src/transformers/models/wav2vec2/modeling_wav2vec2.py::transformers.models.wav2vec2.modeling_wav2vec2.Wav2Vec2ForCTC.forward -sv --doctest-continue-on-failure
379
+ ```
380
+
381
+ ### For Markdown files
382
+
383
+ You can test locally a given file with this command (here testing the quicktour):
384
+
385
+ ```bash
386
+ pytest --doctest-modules docs/source/quicktour.md -sv --doctest-continue-on-failure --doctest-glob="*.md"
387
+ ```
388
+
389
+ ### Writing doctests
390
+
391
+ Here are a few tips to help you debug the doctests and make them pass:
392
+
393
+ - The outputs of the code need to match the expected output **exactly**, so make sure you have the same outputs. In particular doctest will see a difference between single quotes and double quotes, or a missing parenthesis. The only exceptions to that rule are:
394
+ * whitespace: one give whitespace (space, tabulation, new line) is equivalent to any number of whitespace, so you can add new lines where there are spaces to make your output more readable.
395
+ * numerical values: you should never put more than 4 or 5 digits to expected results as different setups or library versions might get you slightly different results. `doctest` is configured to ignore any difference lower than the precision to which you wrote (so 1e-4 if you write 4 digits).
396
+ - Don't leave a block of code that is very long to execute. If you can't make it fast, you can either not use the doctest syntax on it (so that it's ignored), or if you want to use the doctest syntax to show the results, you can add a comment `# doctest: +SKIP` at the end of the lines of code too long to execute
397
+ - Each line of code that produces a result needs to have that result written below. You can ignore an output if you don't want to show it in your code example by adding a comment ` # doctest: +IGNORE_RESULT` at the end of the line of code producing it.
docs/TRANSLATING.md ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Translating the Transformers documentation into your language
2
+
3
+ As part of our mission to democratize machine learning, we'd love to make the Transformers library available in many more languages! Follow the steps below if you want to help translate the documentation into your language 🙏.
4
+
5
+ **🗞️ Open an issue**
6
+
7
+ To get started, navigate to the [Issues](https://github.com/huggingface/transformers/issues) page of this repo and check if anyone else has opened an issue for your language. If not, open a new issue by selecting the "Translation template" from the "New issue" button.
8
+
9
+ Once an issue exists, post a comment to indicate which chapters you'd like to work on, and we'll add your name to the list.
10
+
11
+
12
+ **🍴 Fork the repository**
13
+
14
+ First, you'll need to [fork the Transformers repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo). You can do this by clicking on the **Fork** button on the top-right corner of this repo's page.
15
+
16
+ Once you've forked the repo, you'll want to get the files on your local machine for editing. You can do that by cloning the fork with Git as follows:
17
+
18
+ ```bash
19
+ git clone https://github.com/YOUR-USERNAME/transformers.git
20
+ ```
21
+
22
+ **📋 Copy-paste the English version with a new language code**
23
+
24
+ The documentation files are in one leading directory:
25
+
26
+ - [`docs/source`](https://github.com/huggingface/transformers/tree/main/docs/source): All the documentation materials are organized here by language.
27
+
28
+ You'll only need to copy the files in the [`docs/source/en`](https://github.com/huggingface/transformers/tree/main/docs/source/en) directory, so first navigate to your fork of the repo and run the following:
29
+
30
+ ```bash
31
+ cd ~/path/to/transformers/docs
32
+ cp -r source/en source/LANG-ID
33
+ ```
34
+
35
+ Here, `LANG-ID` should be one of the ISO 639-1 or ISO 639-2 language codes -- see [here](https://www.loc.gov/standards/iso639-2/php/code_list.php) for a handy table.
36
+
37
+ **✍️ Start translating**
38
+
39
+ The fun part comes - translating the text!
40
+
41
+ The first thing we recommend is translating the part of the `_toctree.yml` file that corresponds to your doc chapter. This file is used to render the table of contents on the website.
42
+
43
+ > 🙋 If the `_toctree.yml` file doesn't yet exist for your language, you can create one by copy-pasting from the English version and deleting the sections unrelated to your chapter. Just make sure it exists in the `docs/source/LANG-ID/` directory!
44
+
45
+ The fields you should add are `local` (with the name of the file containing the translation; e.g. `autoclass_tutorial`), and `title` (with the title of the doc in your language; e.g. `Load pretrained instances with an AutoClass`) -- as a reference, here is the `_toctree.yml` for [English](https://github.com/huggingface/transformers/blob/main/docs/source/en/_toctree.yml):
46
+
47
+ ```yaml
48
+ - sections:
49
+ - local: pipeline_tutorial # Do not change this! Use the same name for your .md file
50
+ title: Pipelines for inference # Translate this!
51
+ ...
52
+ title: Tutorials # Translate this!
53
+ ```
54
+
55
+ Once you have translated the `_toctree.yml` file, you can start translating the [MDX](https://mdxjs.com/) files associated with your docs chapter.
56
+
57
+ > 🙋 If you'd like others to help you with the translation, you should [open an issue](https://github.com/huggingface/transformers/issues) and tag @stevhliu and @MKhalusova.
docs/source/_config.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # docstyle-ignore
2
+ INSTALL_CONTENT = """
3
+ # Transformers installation
4
+ ! pip install transformers datasets evaluate accelerate
5
+ # To install from source instead of the last release, comment the command above and uncomment the following one.
6
+ # ! pip install git+https://github.com/huggingface/transformers.git
7
+ """
8
+
9
+ notebook_first_cells = [{"type": "code", "content": INSTALL_CONTENT}]
10
+ black_avoid_patterns = {
11
+ "{processor_class}": "FakeProcessorClass",
12
+ "{model_class}": "FakeModelClass",
13
+ "{object_class}": "FakeObjectClass",
14
+ }
docs/source/de/_config.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # docstyle-ignore
2
+ INSTALL_CONTENT = """
3
+ # Transformers installation
4
+ ! pip install transformers datasets evaluate accelerate
5
+ # To install from source instead of the last release, comment the command above and uncomment the following one.
6
+ # ! pip install git+https://github.com/huggingface/transformers.git
7
+ """
8
+
9
+ notebook_first_cells = [{"type": "code", "content": INSTALL_CONTENT}]
10
+ black_avoid_patterns = {
11
+ "{processor_class}": "FakeProcessorClass",
12
+ "{model_class}": "FakeModelClass",
13
+ "{object_class}": "FakeObjectClass",
14
+ }
docs/source/de/_toctree.yml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ - sections:
2
+ - local: index
3
+ title: 🤗 Transformers
4
+ - local: quicktour
5
+ title: Schnellstart
6
+ - local: installation
7
+ title: Installation
8
+ title: Erste Schritte
9
+ - sections:
10
+ - local: pipeline_tutorial
11
+ title: Pipelines für Inferenzen
12
+ - local: autoclass_tutorial
13
+ title: Laden von vortrainierten Instanzen mit einer AutoClass
14
+ - local: preprocessing
15
+ title: Vorverarbeiten
16
+ - local: training
17
+ title: Optimierung eines vortrainierten Modells
18
+ - local: run_scripts
19
+ title: Trainieren mit einem Skript
20
+ - local: accelerate
21
+ title: Verteiltes Training mit 🤗 Accelerate
22
+ - local: peft
23
+ title: Laden und Trainieren von Adaptern mit 🤗 PEFT
24
+ - local: model_sharing
25
+ title: Ein Modell teilen
26
+ - local: transformers_agents
27
+ title: Agents
28
+ - local: llm_tutorial
29
+ title: Generation with LLMs
30
+ title: Tutorials
31
+ - sections:
32
+ - local: contributing
33
+ title: Wie kann man zu 🤗 Transformers beitragen?
34
+ - local: add_new_model
35
+ title: Wie fügt man ein Modell zu 🤗 Transformers hinzu?
36
+ - local: add_new_pipeline
37
+ title: Wie fügt man eine Pipeline zu 🤗 Transformers hinzu?
38
+ - local: testing
39
+ title: Testen
40
+ - local: pr_checks
41
+ title: Überprüfung einer Pull Request
42
+ title: Contribute
docs/source/de/accelerate.md ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Verteiltes Training mit 🤗 Accelerate
18
+
19
+ Da die Modelle immer größer werden, hat sich die Parallelität als Strategie zum Trainieren größerer Modelle auf begrenzter Hardware und zur Beschleunigung der Trainingsgeschwindigkeit um mehrere Größenordnungen erwiesen. Bei Hugging Face haben wir die Bibliothek [🤗 Accelerate](https://huggingface.co/docs/accelerate) entwickelt, um Nutzern zu helfen, ein 🤗 Transformers-Modell auf jeder Art von verteiltem Setup zu trainieren, egal ob es sich um mehrere GPUs auf einer Maschine oder mehrere GPUs auf mehreren Maschinen handelt. In diesem Tutorial lernen Sie, wie Sie Ihre native PyTorch-Trainingsschleife anpassen, um das Training in einer verteilten Umgebung zu ermöglichen.
20
+
21
+ ## Einrichtung
22
+
23
+ Beginnen Sie mit der Installation von 🤗 Accelerate:
24
+
25
+ ```bash
26
+ pip install accelerate
27
+ ```
28
+
29
+ Dann importieren und erstellen Sie ein [`~accelerate.Accelerator`]-Objekt. Der [`~accelerate.Accelerator`] wird automatisch Ihre Art der verteilten Einrichtung erkennen und alle notwendigen Komponenten für das Training initialisieren. Sie müssen Ihr Modell nicht explizit auf einem Gerät platzieren.
30
+
31
+ ```py
32
+ >>> from accelerate import Accelerator
33
+
34
+ >>> accelerator = Accelerator()
35
+ ```
36
+
37
+ ## Vorbereiten auf die Beschleunigung
38
+
39
+ Der nächste Schritt ist die Übergabe aller relevanten Trainingsobjekte an die Methode [`~accelerate.Accelerator.prepare`]. Dazu gehören Ihre Trainings- und Evaluierungs-DataLoader, ein Modell und ein Optimierer:
40
+
41
+ ```py
42
+ >>> train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
43
+ ... train_dataloader, eval_dataloader, model, optimizer
44
+ ... )
45
+ ```
46
+
47
+ ## Rückwärts
48
+
49
+ Die letzte Ergänzung besteht darin, das typische `loss.backward()` in der Trainingsschleife durch die 🤗 Accelerate-Methode [`~accelerate.Accelerator.backward`] zu ersetzen:
50
+
51
+ ```py
52
+ >>> for epoch in range(num_epochs):
53
+ ... for batch in train_dataloader:
54
+ ... outputs = model(**batch)
55
+ ... loss = outputs.loss
56
+ ... accelerator.backward(loss)
57
+
58
+ ... optimizer.step()
59
+ ... lr_scheduler.step()
60
+ ... optimizer.zero_grad()
61
+ ... progress_bar.update(1)
62
+ ```
63
+
64
+ Wie Sie im folgenden Code sehen können, müssen Sie nur vier zusätzliche Codezeilen zu Ihrer Trainingsschleife hinzufügen, um verteiltes Training zu ermöglichen!
65
+
66
+ ```diff
67
+ + from accelerate import Accelerator
68
+ from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler
69
+
70
+ + accelerator = Accelerator()
71
+
72
+ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
73
+ optimizer = AdamW(model.parameters(), lr=3e-5)
74
+
75
+ - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
76
+ - model.to(device)
77
+
78
+ + train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
79
+ + train_dataloader, eval_dataloader, model, optimizer
80
+ + )
81
+
82
+ num_epochs = 3
83
+ num_training_steps = num_epochs * len(train_dataloader)
84
+ lr_scheduler = get_scheduler(
85
+ "linear",
86
+ optimizer=optimizer,
87
+ num_warmup_steps=0,
88
+ num_training_steps=num_training_steps
89
+ )
90
+
91
+ progress_bar = tqdm(range(num_training_steps))
92
+
93
+ model.train()
94
+ for epoch in range(num_epochs):
95
+ for batch in train_dataloader:
96
+ - batch = {k: v.to(device) for k, v in batch.items()}
97
+ outputs = model(**batch)
98
+ loss = outputs.loss
99
+ - loss.backward()
100
+ + accelerator.backward(loss)
101
+
102
+ optimizer.step()
103
+ lr_scheduler.step()
104
+ optimizer.zero_grad()
105
+ progress_bar.update(1)
106
+ ```
107
+
108
+ ## Trainieren
109
+
110
+ Sobald Sie die entsprechenden Codezeilen hinzugefügt haben, starten Sie Ihr Training in einem Skript oder einem Notebook wie Colaboratory.
111
+
112
+ ### Trainieren mit einem Skript
113
+
114
+ Wenn Sie Ihr Training mit einem Skript durchführen, führen Sie den folgenden Befehl aus, um eine Konfigurationsdatei zu erstellen und zu speichern:
115
+
116
+ ```bash
117
+ accelerate config
118
+ ```
119
+
120
+ Dann starten Sie Ihr Training mit:
121
+
122
+ ```bash
123
+ accelerate launch train.py
124
+ ```
125
+
126
+ ### Trainieren mit einem Notebook
127
+
128
+ 🤗 Accelerate kann auch in einem Notebook laufen, wenn Sie planen, die TPUs von Colaboratory zu verwenden. Verpacken Sie den gesamten Code, der für das Training verantwortlich ist, in eine Funktion und übergeben Sie diese an [`~accelerate.notebook_launcher`]:
129
+
130
+ ```py
131
+ >>> from accelerate import notebook_launcher
132
+
133
+ >>> notebook_launcher(training_function)
134
+ ```
135
+
136
+ Weitere Informationen über 🤗 Accelerate und seine umfangreichen Funktionen finden Sie in der [Dokumentation](https://huggingface.co/docs/accelerate).
docs/source/de/add_new_model.md ADDED
@@ -0,0 +1,891 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+
11
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
12
+ rendered properly in your Markdown viewer.
13
+
14
+ -->
15
+
16
+ # Wie kann ich ein Modell zu 🤗 Transformers hinzufügen?
17
+
18
+ Die 🤗 Transformers-Bibliothek ist dank der Beiträge der Community oft in der Lage, neue Modelle anzubieten. Aber das kann ein anspruchsvolles Projekt sein und erfordert eine eingehende Kenntnis der 🤗 Transformers-Bibliothek und des zu implementierenden Modells. Bei Hugging Face versuchen wir, mehr Mitgliedern der Community die Möglichkeit zu geben, aktiv Modelle hinzuzufügen, und wir haben diese Anleitung zusammengestellt, die Sie durch den Prozess des Hinzufügens eines PyTorch-Modells führt (stellen Sie sicher, dass Sie [PyTorch installiert haben](https://pytorch.org/get-started/locally/)).
19
+
20
+ Auf dem Weg dorthin, werden Sie:
21
+
22
+ - Einblicke in bewährte Open-Source-Verfahren erhalten
23
+ - die Konstruktionsprinzipien hinter einer der beliebtesten Deep-Learning-Bibliotheken verstehen
24
+ - lernen Sie, wie Sie große Modelle effizient testen können
25
+ - lernen Sie, wie Sie Python-Hilfsprogramme wie `black`, `ruff` und `make fix-copies` integrieren, um sauberen und lesbaren Code zu gewährleisten
26
+
27
+ Ein Mitglied des Hugging Face-Teams wird Ihnen dabei zur Seite stehen, damit Sie nicht alleine sind. 🤗 ❤️
28
+
29
+ Um loszulegen, öffnen Sie eine [New model addition](https://github.com/huggingface/transformers/issues/new?assignees=&labels=New+model&template=new-model-addition.yml) Ausgabe für das Modell, das Sie in 🤗 Transformers sehen möchten. Wenn Sie nicht besonders wählerisch sind, wenn es darum geht, ein bestimmtes Modell beizusteuern, können Sie nach dem [New model label](https://github.com/huggingface/transformers/labels/New%20model) filtern, um zu sehen, ob es noch unbeanspruchte Modellanfragen gibt, und daran arbeiten.
30
+
31
+ Sobald Sie eine neue Modellanfrage eröffnet haben, sollten Sie sich zunächst mit 🤗 Transformers vertraut machen, falls Sie das noch nicht sind!
32
+
33
+ ## Allgemeiner Überblick über 🤗 Transformers
34
+
35
+ Zunächst sollten Sie sich einen allgemeinen Überblick über 🤗 Transformers verschaffen. 🤗 Transformers ist eine sehr meinungsfreudige Bibliothek, es ist also möglich, dass
36
+ Es besteht also die Möglichkeit, dass Sie mit einigen der Philosophien oder Designentscheidungen der Bibliothek nicht einverstanden sind. Aus unserer Erfahrung heraus haben wir jedoch
37
+ dass die grundlegenden Designentscheidungen und Philosophien der Bibliothek entscheidend sind, um 🤗 Transformers effizient zu skalieren.
38
+ Transformatoren zu skalieren und gleichzeitig die Wartungskosten auf einem vernünftigen Niveau zu halten.
39
+
40
+ Ein guter erster Ansatzpunkt, um die Bibliothek besser zu verstehen, ist die Lektüre der [Dokumentation unserer Philosophie](Philosophie). Als Ergebnis unserer Arbeitsweise gibt es einige Entscheidungen, die wir versuchen, auf alle Modelle anzuwenden:
41
+
42
+ - Komposition wird im Allgemeinen gegenüber Abstraktion bevorzugt
43
+ - Die Duplizierung von Code ist nicht immer schlecht, wenn sie die Lesbarkeit oder Zugänglichkeit eines Modells stark verbessert
44
+ - Modelldateien sind so in sich geschlossen wie möglich, so dass Sie, wenn Sie den Code eines bestimmten Modells lesen, idealerweise nur
45
+ in die entsprechende Datei `modeling_....py` schauen müssen.
46
+
47
+ Unserer Meinung nach ist der Code der Bibliothek nicht nur ein Mittel, um ein Produkt bereitzustellen, *z.B.* die Möglichkeit, BERT für
48
+ Inferenz zu verwenden, sondern auch als das Produkt selbst, das wir verbessern wollen. Wenn Sie also ein Modell hinzufügen, ist der Benutzer nicht nur die
49
+ Person, die Ihr Modell verwenden wird, sondern auch jeder, der Ihren Code liest, zu verstehen versucht und ihn möglicherweise verbessert.
50
+
51
+ Lassen Sie uns daher ein wenig tiefer in das allgemeine Design der Bibliothek einsteigen.
52
+
53
+ ### Überblick über die Modelle
54
+
55
+ Um ein Modell erfolgreich hinzuzufügen, ist es wichtig, die Interaktion zwischen Ihrem Modell und seiner Konfiguration zu verstehen,
56
+ [`PreTrainedModel`] und [`PretrainedConfig`]. Als Beispiel werden wir
57
+ das Modell, das zu 🤗 Transformers hinzugefügt werden soll, `BrandNewBert` nennen.
58
+
59
+ Schauen wir uns das mal an:
60
+
61
+ <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers_overview.png"/>
62
+
63
+ Wie Sie sehen, machen wir in 🤗 Transformers von der Vererbung Gebrauch, aber wir beschränken die Abstraktionsebene auf ein absolutes Minimum.
64
+ Minimum. Es gibt nie mehr als zwei Abstraktionsebenen für ein Modell in der Bibliothek. `BrandNewBertModel`
65
+ erbt von `BrandNewBertPreTrainedModel`, das wiederum von [`PreTrainedModel`] erbt und
66
+ das war's. In der Regel wollen wir sicherstellen, dass ein neues Modell nur von
67
+ [`PreTrainedModel`] abhängt. Die wichtigen Funktionalitäten, die jedem neuen Modell automatisch zur Verfügung gestellt werden, sind
68
+ Modell automatisch bereitgestellt werden, sind [`~PreTrainedModel.from_pretrained`] und
69
+ [`~PreTrainedModel.save_pretrained`], die für die Serialisierung und Deserialisierung verwendet werden. Alle
70
+ anderen wichtigen Funktionalitäten, wie `BrandNewBertModel.forward` sollten vollständig in der neuen
71
+ Skript `modeling_brand_new_bert.py` definiert werden. Als nächstes wollen wir sicherstellen, dass ein Modell mit einer bestimmten Kopfebene, wie z.B.
72
+ `BrandNewBertForMaskedLM` nicht von `BrandNewBertModel` erbt, sondern `BrandNewBertModel` verwendet
73
+ als Komponente, die im Forward Pass aufgerufen werden kann, um die Abstraktionsebene niedrig zu halten. Jedes neue Modell erfordert eine
74
+ Konfigurationsklasse, genannt `BrandNewBertConfig`. Diese Konfiguration wird immer als ein Attribut in
75
+ [PreTrainedModel] gespeichert und kann daher über das Attribut `config` für alle Klassen aufgerufen werden
76
+ die von `BrandNewBertPreTrainedModel` erben:
77
+
78
+ ```python
79
+ model = BrandNewBertModel.from_pretrained("brandy/brand_new_bert")
80
+ model.config # model has access to its config
81
+ ```
82
+
83
+ Ähnlich wie das Modell erbt die Konfiguration grundlegende Serialisierungs- und Deserialisierungsfunktionalitäten von
84
+ [`PretrainedConfig`]. Beachten Sie, dass die Konfiguration und das Modell immer in zwei verschiedene Formate serialisiert werden
85
+ unterschiedliche Formate serialisiert werden - das Modell in eine *pytorch_model.bin* Datei und die Konfiguration in eine *config.json* Datei. Aufruf von
86
+ [`~PreTrainedModel.save_pretrained`] wird automatisch
87
+ [`~PretrainedConfig.save_pretrained`] auf, so dass sowohl das Modell als auch die Konfiguration gespeichert werden.
88
+
89
+
90
+ ### Code-Stil
91
+
92
+ Wenn Sie Ihr neues Modell kodieren, sollten Sie daran denken, dass Transformers eine Bibliothek mit vielen Meinungen ist und dass wir selbst ein paar Macken haben
93
+ wie der Code geschrieben werden sollte :-)
94
+
95
+ 1. Der Vorwärtsdurchlauf Ihres Modells sollte vollständig in die Modellierungsdatei geschrieben werden und dabei völlig unabhängig von anderen
96
+ Modellen in der Bibliothek. Wenn Sie einen Block aus einem anderen Modell wiederverwenden möchten, kopieren Sie den Code und fügen ihn mit einem
97
+ `# Kopiert von` ein (siehe [hier](https://github.com/huggingface/transformers/blob/v4.17.0/src/transformers/models/roberta/modeling_roberta.py#L160)
98
+ für ein gutes Beispiel und [hier](pr_checks#check-copies) für weitere Dokumentation zu Copied from).
99
+ 2. Der Code sollte vollständig verständlich sein, auch für einen Nicht-Muttersprachler. Das heißt, Sie sollten
100
+ beschreibende Variablennamen wählen und Abkürzungen vermeiden. Ein Beispiel: `activation` ist `act` vorzuziehen.
101
+ Von Variablennamen mit nur einem Buchstaben wird dringend abgeraten, es sei denn, es handelt sich um einen Index in einer for-Schleife.
102
+ 3. Generell ziehen wir längeren expliziten Code einem kurzen magischen Code vor.
103
+ 4. Vermeiden Sie die Unterklassifizierung von `nn.Sequential` in PyTorch, sondern unterklassifizieren Sie `nn.Module` und schreiben Sie den Vorwärtspass, so dass jeder
104
+ so dass jeder, der Ihren Code verwendet, ihn schnell debuggen kann, indem er Druckanweisungen oder Haltepunkte hinzufügt.
105
+ 5. Ihre Funktionssignatur sollte mit einer Typ-Annotation versehen sein. Im Übrigen sind gute Variablennamen viel lesbarer und verständlicher
106
+ verständlicher als Typ-Anmerkungen.
107
+
108
+ ### Übersicht der Tokenizer
109
+
110
+ Noch nicht ganz fertig :-( Dieser Abschnitt wird bald hinzugefügt!
111
+
112
+ ## Schritt-für-Schritt-Rezept zum Hinzufügen eines Modells zu 🤗 Transformers
113
+
114
+ Jeder hat andere Vorlieben, was die Portierung eines Modells angeht. Daher kann es sehr hilfreich sein, wenn Sie sich Zusammenfassungen ansehen
115
+ wie andere Mitwirkende Modelle auf Hugging Face portiert haben. Hier ist eine Liste von Blogbeiträgen aus der Community, wie man ein Modell portiert:
116
+
117
+ 1. [Portierung eines GPT2-Modells](https://medium.com/huggingface/from-tensorflow-to-pytorch-265f40ef2a28) von [Thomas](https://huggingface.co/thomwolf)
118
+ 2. [Portierung des WMT19 MT-Modells](https://huggingface.co/blog/porting-fsmt) von [Stas](https://huggingface.co/stas)
119
+
120
+ Aus Erfahrung können wir Ihnen sagen, dass die wichtigsten Dinge, die Sie beim Hinzufügen eines Modells beachten müssen, sind:
121
+
122
+ - Erfinden Sie das Rad nicht neu! Die meisten Teile des Codes, den Sie für das neue 🤗 Transformers-Modell hinzufügen werden, existieren bereits
123
+ irgendwo in 🤗 Transformers. Nehmen Sie sich etwas Zeit, um ähnliche, bereits vorhandene Modelle und Tokenizer zu finden, die Sie kopieren können
124
+ von. [grep](https://www.gnu.org/software/grep/) und [rg](https://github.com/BurntSushi/ripgrep) sind Ihre
125
+ Freunde. Beachten Sie, dass es sehr gut möglich ist, dass der Tokenizer Ihres Modells auf einer Modellimplementierung basiert und
126
+ und der Modellierungscode Ihres Modells auf einer anderen. *Z.B.* Der Modellierungscode von FSMT basiert auf BART, während der Tokenizer-Code von FSMT
127
+ auf XLM basiert.
128
+ - Es handelt sich eher um eine technische als um eine wissenschaftliche Herausforderung. Sie sollten mehr Zeit auf die Schaffung einer
129
+ eine effiziente Debugging-Umgebung zu schaffen, als zu versuchen, alle theoretischen Aspekte des Modells in dem Papier zu verstehen.
130
+ - Bitten Sie um Hilfe, wenn Sie nicht weiterkommen! Modelle sind der Kernbestandteil von 🤗 Transformers, so dass wir bei Hugging Face mehr als
131
+ mehr als glücklich, Ihnen bei jedem Schritt zu helfen, um Ihr Modell hinzuzufügen. Zögern Sie nicht zu fragen, wenn Sie merken, dass Sie nicht weiterkommen.
132
+ Fortschritte machen.
133
+
134
+ Im Folgenden versuchen wir, Ihnen ein allgemeines Rezept an die Hand zu geben, das uns bei der Portierung eines Modells auf 🤗 Transformers am nützlichsten erschien.
135
+
136
+ Die folgende Liste ist eine Zusammenfassung all dessen, was getan werden muss, um ein Modell hinzuzufügen und kann von Ihnen als To-Do verwendet werden
137
+ Liste verwenden:
138
+
139
+ ☐ (Optional) Verstehen der theoretischen Aspekte des Modells<br>
140
+ ☐ Vorbereiten der 🤗 Transformers-Entwicklungsumgebung<br>
141
+ ☐ Debugging-Umgebung des ursprünglichen Repositorys eingerichtet<br>
142
+ ☐ Skript erstellt, das den Durchlauf `forward()` unter Verwendung des ursprünglichen Repositorys und des Checkpoints erfolgreich durchführt<br>
143
+ ☐ Erfolgreich das Modellskelett zu 🤗 Transformers hinzugefügt<br>
144
+ ☐ Erfolgreiche Umwandlung des ursprünglichen Prüfpunkts in den 🤗 Transformers-Prüfpunkt<br>
145
+ ☐ Erfolgreich den Durchlauf `forward()` in 🤗 Transformers ausgeführt, der eine identische Ausgabe wie der ursprüngliche Prüfpunkt liefert<br>
146
+ ☐ Modell-Tests in 🤗 Transformers abgeschlossen<br>
147
+ ☐ Erfolgreich Tokenizer in 🤗 Transformers hinzugefügt<br>
148
+ ☐ End-to-End-Integrationstests ausgeführt<br>
149
+ ☐ Docs fertiggestellt<br>
150
+ ☐ Modellgewichte in den Hub hochgeladen<br>
151
+ ☐ Die Pull-Anfrage eingereicht<br>
152
+ ☐ (Optional) Hinzufügen eines Demo-Notizbuchs
153
+
154
+ Für den Anfang empfehlen wir in der Regel, mit einem guten theoretischen Verständnis von `BrandNewBert` zu beginnen. Wie auch immer,
155
+ wenn Sie es vorziehen, die theoretischen Aspekte des Modells *on-the-job* zu verstehen, dann ist es völlig in Ordnung, direkt in die
156
+ in die Code-Basis von `BrandNewBert` einzutauchen. Diese Option könnte für Sie besser geeignet sein, wenn Ihre technischen Fähigkeiten besser sind als
157
+ als Ihre theoretischen Fähigkeiten, wenn Sie Schwierigkeiten haben, die Arbeit von `BrandNewBert` zu verstehen, oder wenn Sie einfach Spaß am Programmieren
158
+ mehr Spaß am Programmieren haben als am Lesen wissenschaftlicher Abhandlungen.
159
+
160
+ ### 1. (Optional) Theoretische Aspekte von BrandNewBert
161
+
162
+ Sie sollten sich etwas Zeit nehmen, um die Abhandlung von *BrandNewBert* zu lesen, falls eine solche Beschreibung existiert. Möglicherweise gibt es große
163
+ Abschnitte des Papiers, die schwer zu verstehen sind. Wenn das der Fall ist, ist das in Ordnung - machen Sie sich keine Sorgen! Das Ziel ist
164
+ ist es nicht, ein tiefes theoretisches Verständnis des Papiers zu erlangen, sondern die notwendigen Informationen zu extrahieren, um
165
+ das Modell effektiv in 🤗 Transformers zu implementieren. Das heißt, Sie müssen nicht zu viel Zeit auf die
166
+ theoretischen Aspekten verbringen, sondern sich lieber auf die praktischen Aspekte konzentrieren, nämlich:
167
+
168
+ - Welche Art von Modell ist *brand_new_bert*? BERT-ähnliches Modell nur für den Encoder? GPT2-ähnliches reines Decoder-Modell? BART-ähnliches
169
+ Encoder-Decoder-Modell? Sehen Sie sich die [model_summary](model_summary) an, wenn Sie mit den Unterschieden zwischen diesen Modellen nicht vertraut sind.
170
+ - Was sind die Anwendungen von *brand_new_bert*? Textklassifizierung? Texterzeugung? Seq2Seq-Aufgaben, *z.B.,*
171
+ Zusammenfassungen?
172
+ - Was ist die neue Eigenschaft des Modells, die es von BERT/GPT-2/BART unterscheidet?
173
+ - Welches der bereits existierenden [🤗 Transformers-Modelle](https://huggingface.co/transformers/#contents) ist am ähnlichsten
174
+ ähnlich wie *brand_new_bert*?
175
+ - Welche Art von Tokenizer wird verwendet? Ein Satzteil-Tokenisierer? Ein Wortstück-Tokenisierer? Ist es derselbe Tokenisierer, der für
176
+ für BERT oder BART?
177
+
178
+ Nachdem Sie das Gefühl haben, einen guten Überblick über die Architektur des Modells erhalten zu haben, können Sie dem
179
+ Hugging Face Team schreiben und Ihre Fragen stellen. Dazu können Fragen zur Architektur des Modells gehören,
180
+ seiner Aufmerksamkeitsebene usw. Wir werden Ihnen gerne weiterhelfen.
181
+
182
+ ### 2. Bereiten Sie als nächstes Ihre Umgebung vor
183
+
184
+ 1. Forken Sie das [Repository](https://github.com/huggingface/transformers), indem Sie auf der Seite des Repositorys auf die Schaltfläche 'Fork' klicken.
185
+ Seite des Repositorys klicken. Dadurch wird eine Kopie des Codes unter Ihrem GitHub-Benutzerkonto erstellt.
186
+
187
+ 2. Klonen Sie Ihren `transformers` Fork auf Ihre lokale Festplatte und fügen Sie das Basis-Repository als Remote hinzu:
188
+
189
+ ```bash
190
+ git clone https://github.com/[your Github handle]/transformers.git
191
+ cd transformers
192
+ git remote add upstream https://github.com/huggingface/transformers.git
193
+ ```
194
+
195
+ 3. Richten Sie eine Entwicklungsumgebung ein, indem Sie z.B. den folgenden Befehl ausführen:
196
+
197
+ ```bash
198
+ python -m venv .env
199
+ source .env/bin/activate
200
+ pip install -e ".[dev]"
201
+ ```
202
+
203
+ Abhängig von Ihrem Betriebssystem und da die Anzahl der optionalen Abhängigkeiten von Transformers wächst, kann es sein, dass Sie bei diesem Befehl einen
204
+ Fehler mit diesem Befehl. Stellen Sie in diesem Fall sicher, dass Sie das Deep Learning Framework, mit dem Sie arbeiten, installieren
205
+ (PyTorch, TensorFlow und/oder Flax) und führen Sie es aus:
206
+
207
+ ```bash
208
+ pip install -e ".[quality]"
209
+ ```
210
+
211
+ was für die meisten Anwendungsfälle ausreichend sein sollte. Sie können dann zum übergeordneten Verzeichnis zurückkehren
212
+
213
+ ```bash
214
+ cd ..
215
+ ```
216
+
217
+ 4. Wir empfehlen, die PyTorch-Version von *brand_new_bert* zu Transformers hinzuzufügen. Um PyTorch zu installieren, folgen Sie bitte den
218
+ Anweisungen auf https://pytorch.org/get-started/locally/.
219
+
220
+ **Anmerkung:** Sie müssen CUDA nicht installiert haben. Es reicht aus, das neue Modell auf der CPU zum Laufen zu bringen.
221
+
222
+ 5. Um *brand_new_bert* zu portieren, benötigen Sie außerdem Zugriff auf das Original-Repository:
223
+
224
+ ```bash
225
+ git clone https://github.com/org_that_created_brand_new_bert_org/brand_new_bert.git
226
+ cd brand_new_bert
227
+ pip install -e .
228
+ ```
229
+
230
+ Jetzt haben Sie eine Entwicklungsumgebung eingerichtet, um *brand_new_bert* auf 🤗 Transformers zu portieren.
231
+
232
+ ### 3.-4. Führen Sie einen Pre-Training-Checkpoint mit dem Original-Repository durch
233
+
234
+ Zunächst werden Sie mit dem ursprünglichen *brand_new_bert* Repository arbeiten. Oft ist die ursprüngliche Implementierung sehr
235
+ "forschungslastig". Das bedeutet, dass es an Dokumentation mangeln kann und der Code schwer zu verstehen sein kann. Aber das sollte
236
+ genau Ihre Motivation sein, *brand_new_bert* neu zu implementieren. Eines unserer Hauptziele bei Hugging Face ist es, *die Menschen dazu zu bringen
237
+ auf den Schultern von Giganten zu stehen*, was sich hier sehr gut darin ausdrückt, dass wir ein funktionierendes Modell nehmen und es umschreiben, um es so
238
+ es so **zugänglich, benutzerfreundlich und schön** wie möglich zu machen. Dies ist die wichtigste Motivation für die Neuimplementierung von
239
+ Modelle in 🤗 Transformers umzuwandeln - der Versuch, komplexe neue NLP-Technologie für **jeden** zugänglich zu machen.
240
+
241
+ Sie sollten damit beginnen, indem Sie in das Original-Repository eintauchen.
242
+
243
+ Die erfolgreiche Ausführung des offiziellen Pre-Trainingsmodells im Original-Repository ist oft **der schwierigste** Schritt.
244
+ Unserer Erfahrung nach ist es sehr wichtig, dass Sie einige Zeit damit verbringen, sich mit der ursprünglichen Code-Basis vertraut zu machen. Sie müssen
245
+ das Folgende herausfinden:
246
+
247
+ - Wo finden Sie die vortrainierten Gewichte?
248
+ - Wie lädt man die vorab trainierten Gewichte in das entsprechende Modell?
249
+ - Wie kann der Tokenizer unabhängig vom Modell ausgeführt werden?
250
+ - Verfolgen Sie einen Forward Pass, damit Sie wissen, welche Klassen und Funktionen für einen einfachen Forward Pass erforderlich sind. Normalerweise,
251
+ müssen Sie nur diese Funktionen reimplementieren.
252
+ - Sie müssen in der Lage sein, die wichtigen Komponenten des Modells zu finden: Wo befindet sich die Klasse des Modells? Gibt es Unterklassen des Modells,
253
+ *z.B.* EncoderModel, DecoderModel? Wo befindet sich die Selbstaufmerksamkeitsschicht? Gibt es mehrere verschiedene Aufmerksamkeitsebenen,
254
+ *z.B.* *Selbstaufmerksamkeit*, *Kreuzaufmerksamkeit*...?
255
+ - Wie können Sie das Modell in der ursprünglichen Umgebung des Repo debuggen? Müssen Sie *print* Anweisungen hinzufügen, können Sie
256
+ mit einem interaktiven Debugger wie *ipdb* arbeiten oder sollten Sie eine effiziente IDE zum Debuggen des Modells verwenden, wie z.B. PyCharm?
257
+
258
+ Es ist sehr wichtig, dass Sie, bevor Sie mit der Portierung beginnen, den Code im Original-Repository **effizient** debuggen können
259
+ Repository können! Denken Sie auch daran, dass Sie mit einer Open-Source-Bibliothek arbeiten, also zögern Sie nicht, ein Problem oder
260
+ oder sogar eine Pull-Anfrage im Original-Repository zu stellen. Die Betreuer dieses Repositorys sind wahrscheinlich sehr froh darüber
261
+ dass jemand in ihren Code schaut!
262
+
263
+ An diesem Punkt liegt es wirklich an Ihnen, welche Debugging-Umgebung und Strategie Sie zum Debuggen des ursprünglichen
264
+ Modell zu debuggen. Wir raten dringend davon ab, eine kostspielige GPU-Umgebung einzurichten, sondern arbeiten Sie einfach auf einer CPU, sowohl wenn Sie mit dem
265
+ in das ursprüngliche Repository einzutauchen und auch, wenn Sie beginnen, die 🤗 Transformers-Implementierung des Modells zu schreiben. Nur
266
+ ganz am Ende, wenn das Modell bereits erfolgreich auf 🤗 Transformers portiert wurde, sollte man überprüfen, ob das
267
+ Modell auch auf der GPU wie erwartet funktioniert.
268
+
269
+ Im Allgemeinen gibt es zwei mögliche Debugging-Umgebungen für die Ausführung des Originalmodells
270
+
271
+ - [Jupyter notebooks](https://jupyter.org/) / [google colab](https://colab.research.google.com/notebooks/intro.ipynb)
272
+ - Lokale Python-Skripte.
273
+
274
+ Jupyter-Notebooks haben den Vorteil, dass sie eine zellenweise Ausführung ermöglichen, was hilfreich sein kann, um logische Komponenten besser voneinander zu trennen und
275
+ logische Komponenten voneinander zu trennen und schnellere Debugging-Zyklen zu haben, da Zwischenergebnisse gespeichert werden können. Außerdem,
276
+ Außerdem lassen sich Notebooks oft leichter mit anderen Mitwirkenden teilen, was sehr hilfreich sein kann, wenn Sie das Hugging Face Team um Hilfe bitten möchten.
277
+ Face Team um Hilfe bitten. Wenn Sie mit Jupyter-Notizbüchern vertraut sind, empfehlen wir Ihnen dringend, mit ihnen zu arbeiten.
278
+
279
+ Der offensichtliche Nachteil von Jupyter-Notizbüchern ist, dass Sie, wenn Sie nicht daran gewöhnt sind, mit ihnen zu arbeiten, einige Zeit damit verbringen müssen
280
+ einige Zeit damit verbringen müssen, sich an die neue Programmierumgebung zu gewöhnen, und dass Sie möglicherweise Ihre bekannten Debugging-Tools nicht mehr verwenden können
281
+ wie z.B. `ipdb` nicht mehr verwenden können.
282
+
283
+ Für jede Codebasis ist es immer ein guter erster Schritt, einen **kleinen** vortrainierten Checkpoint zu laden und in der Lage zu sein, einen
284
+ einzelnen Vorwärtsdurchlauf mit einem Dummy-Integer-Vektor von Eingabe-IDs als Eingabe zu reproduzieren. Ein solches Skript könnte wie folgt aussehen (in
285
+ Pseudocode):
286
+
287
+ ```python
288
+ model = BrandNewBertModel.load_pretrained_checkpoint("/path/to/checkpoint/")
289
+ input_ids = [0, 4, 5, 2, 3, 7, 9] # vector of input ids
290
+ original_output = model.predict(input_ids)
291
+ ```
292
+
293
+ Was die Debugging-Strategie anbelangt, so können Sie im Allgemeinen aus mehreren Strategien wählen:
294
+
295
+ - Zerlegen Sie das ursprüngliche Modell in viele kleine testbare Komponenten und führen Sie für jede dieser Komponenten einen Vorwärtsdurchlauf zur
296
+ Überprüfung
297
+ - Zerlegen Sie das ursprüngliche Modell nur in den ursprünglichen *Tokenizer* und das ursprüngliche *Modell*, führen Sie einen Vorwärtsdurchlauf für diese Komponenten durch
298
+ und verwenden Sie dazwischenliegende Druckanweisungen oder Haltepunkte zur Überprüfung.
299
+
300
+ Auch hier bleibt es Ihnen überlassen, welche Strategie Sie wählen. Oft ist die eine oder die andere Strategie vorteilhaft, je nach der ursprünglichen Codebasis
301
+ Basis.
302
+
303
+ Wenn die ursprüngliche Codebasis es Ihnen erlaubt, das Modell in kleinere Teilkomponenten zu zerlegen, *z.B.* wenn die ursprüngliche
304
+ Code-Basis problemlos im Eager-Modus ausgeführt werden kann, lohnt es sich in der Regel, dies zu tun. Es gibt einige wichtige Vorteile
305
+ am Anfang den schwierigeren Weg zu gehen:
306
+
307
+ - Wenn Sie später das ursprüngliche Modell mit der Hugging Face-Implementierung vergleichen, können Sie automatisch überprüfen, ob
308
+ für jede Komponente einzeln überprüfen, ob die entsprechende Komponente der 🤗 Transformers-Implementierung übereinstimmt, anstatt sich auf
309
+ anstatt sich auf den visuellen Vergleich über Druckanweisungen zu verlassen
310
+ - können Sie das große Problem der Portierung eines Modells in kleinere Probleme der Portierung einzelner Komponenten zerlegen
311
+ einzelnen Komponenten zu zerlegen und so Ihre Arbeit besser zu strukturieren
312
+ - Die Aufteilung des Modells in logisch sinnvolle Komponenten hilft Ihnen, einen besseren Überblick über das Design des Modells zu bekommen
313
+ und somit das Modell besser zu verstehen
314
+ - In einem späteren Stadium helfen Ihnen diese komponentenweisen Tests dabei, sicherzustellen, dass keine Regressionen auftreten, während Sie fortfahren
315
+ Ihren Code ändern
316
+
317
+ [Lysandre's](https://gist.github.com/LysandreJik/db4c948f6b4483960de5cbac598ad4ed) Integrationstests für ELECTRA
318
+ gibt ein schönes Beispiel dafür, wie dies geschehen kann.
319
+
320
+ Wenn die ursprüngliche Codebasis jedoch sehr komplex ist oder nur die Ausführung von Zwischenkomponenten in einem kompilierten Modus erlaubt,
321
+ könnte es zu zeitaufwändig oder sogar unmöglich sein, das Modell in kleinere testbare Teilkomponenten zu zerlegen. Ein gutes
322
+ Beispiel ist die [T5's MeshTensorFlow](https://github.com/tensorflow/mesh/tree/master/mesh_tensorflow) Bibliothek, die sehr komplex ist
323
+ sehr komplex ist und keine einfache Möglichkeit bietet, das Modell in seine Unterkomponenten zu zerlegen. Bei solchen Bibliotheken ist man
324
+ oft auf die Überprüfung von Druckanweisungen angewiesen.
325
+
326
+ Unabhängig davon, welche Strategie Sie wählen, ist die empfohlene Vorgehensweise oft die gleiche, nämlich dass Sie mit der Fehlersuche in den
327
+ die Anfangsebenen zuerst und die Endebenen zuletzt debuggen.
328
+
329
+ Es wird empfohlen, dass Sie die Ausgaben der folgenden Ebenen abrufen, entweder durch Druckanweisungen oder Unterkomponentenfunktionen
330
+ Schichten in der folgenden Reihenfolge abrufen:
331
+
332
+ 1. Rufen Sie die Eingabe-IDs ab, die an das Modell übergeben wurden
333
+ 2. Rufen Sie die Worteinbettungen ab
334
+ 3. Rufen Sie die Eingabe der ersten Transformer-Schicht ab
335
+ 4. Rufen Sie die Ausgabe der ersten Transformer-Schicht ab
336
+ 5. Rufen Sie die Ausgabe der folgenden n - 1 Transformer-Schichten ab
337
+ 6. Rufen Sie die Ausgabe des gesamten BrandNewBert Modells ab
338
+
339
+ Die Eingabe-IDs sollten dabei aus einem Array von Ganzzahlen bestehen, *z.B.* `input_ids = [0, 4, 4, 3, 2, 4, 1, 7, 19]`
340
+
341
+ Die Ausgaben der folgenden Schichten bestehen oft aus mehrdimensionalen Float-Arrays und können wie folgt aussehen:
342
+
343
+ ```
344
+ [[
345
+ [-0.1465, -0.6501, 0.1993, ..., 0.1451, 0.3430, 0.6024],
346
+ [-0.4417, -0.5920, 0.3450, ..., -0.3062, 0.6182, 0.7132],
347
+ [-0.5009, -0.7122, 0.4548, ..., -0.3662, 0.6091, 0.7648],
348
+ ...,
349
+ [-0.5613, -0.6332, 0.4324, ..., -0.3792, 0.7372, 0.9288],
350
+ [-0.5416, -0.6345, 0.4180, ..., -0.3564, 0.6992, 0.9191],
351
+ [-0.5334, -0.6403, 0.4271, ..., -0.3339, 0.6533, 0.8694]]],
352
+ ```
353
+
354
+ Wir erwarten, dass jedes zu 🤗 Transformers hinzugefügte Modell eine Reihe von Integrationstests besteht, was bedeutet, dass das ursprüngliche
355
+ Modell und die neu implementierte Version in 🤗 Transformers exakt dieselbe Ausgabe liefern müssen, und zwar mit einer Genauigkeit von 0,001!
356
+ Da es normal ist, dass das exakt gleiche Modell, das in verschiedenen Bibliotheken geschrieben wurde, je nach Bibliotheksrahmen eine leicht unterschiedliche Ausgabe liefern kann
357
+ eine leicht unterschiedliche Ausgabe liefern kann, akzeptieren wir eine Fehlertoleranz von 1e-3 (0,001). Es reicht nicht aus, wenn das Modell
358
+ fast das gleiche Ergebnis liefert, sie müssen fast identisch sein. Daher werden Sie sicherlich die Zwischenergebnisse
359
+ Zwischenergebnisse der 🤗 Transformers-Version mehrfach mit den Zwischenergebnissen der ursprünglichen Implementierung von
360
+ *brand_new_bert* vergleichen. In diesem Fall ist eine **effiziente** Debugging-Umgebung des ursprünglichen Repositorys absolut
361
+ wichtig ist. Hier sind einige Ratschläge, um Ihre Debugging-Umgebung so effizient wie möglich zu gestalten.
362
+
363
+ - Finden Sie den besten Weg, um Zwischenergebnisse zu debuggen. Ist das ursprüngliche Repository in PyTorch geschrieben? Dann sollten Sie
364
+ dann sollten Sie sich wahrscheinlich die Zeit nehmen, ein längeres Skript zu schreiben, das das ursprüngliche Modell in kleinere Unterkomponenten zerlegt, um
365
+ Zwischenwerte abzurufen. Ist das ursprüngliche Repository in Tensorflow 1 geschrieben? Dann müssen Sie sich möglicherweise auf die
366
+ TensorFlow Druckoperationen wie [tf.print](https://www.tensorflow.org/api_docs/python/tf/print) verlassen, um die
367
+ Zwischenwerte auszugeben. Ist das ursprüngliche Repository in Jax geschrieben? Dann stellen Sie sicher, dass das Modell **nicht jitted** ist, wenn
368
+ wenn Sie den Vorwärtsdurchlauf ausführen, *z.B.* schauen Sie sich [dieser Link](https://github.com/google/jax/issues/196) an.
369
+ - Verwenden Sie den kleinsten vortrainierten Prüfpunkt, den Sie finden können. Je kleiner der Prüfpunkt ist, desto schneller wird Ihr Debugging-Zyklus
370
+ wird. Es ist nicht effizient, wenn Ihr vorab trainiertes Modell so groß ist, dass Ihr Vorwärtsdurchlauf mehr als 10 Sekunden dauert.
371
+ Falls nur sehr große Checkpoints verfügbar sind, kann es sinnvoller sein, ein Dummy-Modell in der neuen
372
+ Umgebung mit zufällig initialisierten Gewichten zu erstellen und diese Gewichte zum Vergleich mit der 🤗 Transformers-Version
373
+ Ihres Modells
374
+ - Vergewissern Sie sich, dass Sie den einfachsten Weg wählen, um einen Forward Pass im ursprünglichen Repository aufzurufen. Idealerweise sollten Sie
375
+ die Funktion im originalen Repository finden, die **nur** einen einzigen Vorwärtspass aufruft, *d.h.* die oft aufgerufen wird
376
+ Vorhersagen", "Auswerten", "Vorwärts" oder "Aufruf" genannt wird. Sie wollen keine Funktion debuggen, die `forward` aufruft
377
+ mehrfach aufruft, *z.B.* um Text zu erzeugen, wie `autoregressive_sample`, `generate`.
378
+ - Versuchen Sie, die Tokenisierung vom *Forward*-Pass des Modells zu trennen. Wenn das Original-Repository Beispiele zeigt, bei denen
379
+ Sie eine Zeichenkette eingeben müssen, dann versuchen Sie herauszufinden, an welcher Stelle im Vorwärtsaufruf die Zeichenketteneingabe in Eingabe-IDs geändert wird
380
+ geändert wird und beginnen Sie an dieser Stelle. Das könnte bedeuten, dass Sie möglicherweise selbst ein kleines Skript schreiben oder den
381
+ Originalcode so ändern müssen, dass Sie die ids direkt eingeben können, anstatt eine Zeichenkette einzugeben.
382
+ - Vergewissern Sie sich, dass sich das Modell in Ihrem Debugging-Setup **nicht** im Trainingsmodus befindet, der oft dazu führt, dass das Modell
383
+ Dies führt häufig zu zufälligen Ergebnissen, da das Modell mehrere Dropout-Schichten enthält. Stellen Sie sicher, dass der Vorwärtsdurchlauf in Ihrer Debugging
384
+ Umgebung **deterministisch** ist, damit die Dropout-Schichten nicht verwendet werden. Oder verwenden Sie *transformers.utils.set_seed*.
385
+ wenn sich die alte und die neue Implementierung im selben Framework befinden.
386
+
387
+ Im folgenden Abschnitt finden Sie genauere Details/Tipps, wie Sie dies für *brand_new_bert* tun können.
388
+
389
+ ### 5.-14. Portierung von BrandNewBert auf 🤗 Transformatoren
390
+
391
+ Als nächstes können Sie endlich damit beginnen, neuen Code zu 🤗 Transformers hinzuzufügen. Gehen Sie in den Klon Ihres 🤗 Transformers Forks:
392
+
393
+ ```bash
394
+ cd transformers
395
+ ```
396
+
397
+ In dem speziellen Fall, dass Sie ein Modell hinzufügen, dessen Architektur genau mit der Modellarchitektur eines
398
+ Modells übereinstimmt, müssen Sie nur ein Konvertierungsskript hinzufügen, wie in [diesem Abschnitt](#write-a-conversion-script) beschrieben.
399
+ In diesem Fall können Sie einfach die gesamte Modellarchitektur des bereits vorhandenen Modells wiederverwenden.
400
+
401
+ Andernfalls beginnen wir mit der Erstellung eines neuen Modells. Wir empfehlen die Verwendung des folgenden Skripts, um ein Modell hinzuzufügen
402
+ ein bestehendes Modell:
403
+
404
+ ```bash
405
+ transformers-cli add-new-model-like
406
+ ```
407
+
408
+ Sie werden mit einem Fragebogen aufgefordert, die grundlegenden Informationen Ihres Modells einzugeben.
409
+
410
+ **Eröffnen Sie einen Pull Request auf dem Haupt-Repositorium huggingface/transformers**
411
+
412
+ Bevor Sie mit der Anpassung des automatisch generierten Codes beginnen, ist es nun an der Zeit, einen "Work in progress (WIP)" Pull
413
+ Anfrage, *z.B.* "[WIP] Add *brand_new_bert*", in 🤗 Transformers zu öffnen, damit Sie und das Hugging Face Team
414
+ Seite an Seite an der Integration des Modells in 🤗 Transformers arbeiten können.
415
+
416
+ Sie sollten Folgendes tun:
417
+
418
+ 1. Erstellen Sie eine Verzweigung mit einem beschreibenden Namen von Ihrer Hauptverzweigung
419
+
420
+ ```bash
421
+ git checkout -b add_brand_new_bert
422
+ ```
423
+
424
+ 2. Bestätigen Sie den automatisch generierten Code:
425
+
426
+ ```bash
427
+ git add .
428
+ git commit
429
+ ```
430
+
431
+ 3. Abrufen und zurücksetzen auf die aktuelle Haupt
432
+
433
+ ```bash
434
+ git fetch upstream
435
+ git rebase upstream/main
436
+ ```
437
+
438
+ 4. Übertragen Sie die Änderungen auf Ihr Konto mit:
439
+
440
+ ```bash
441
+ git push -u origin a-descriptive-name-for-my-changes
442
+ ```
443
+
444
+ 5. Wenn Sie zufrieden sind, gehen Sie auf die Webseite Ihrer Abspaltung auf GitHub. Klicken Sie auf "Pull request". Stellen Sie sicher, dass Sie das
445
+ GitHub-Handle einiger Mitglieder des Hugging Face-Teams als Reviewer hinzuzufügen, damit das Hugging Face-Team über zukünftige Änderungen informiert wird.
446
+ zukünftige Änderungen benachrichtigt wird.
447
+
448
+ 6. Ändern Sie den PR in einen Entwurf, indem Sie auf der rechten Seite der GitHub-Pull-Request-Webseite auf "In Entwurf umwandeln" klicken.
449
+
450
+ Vergessen Sie im Folgenden nicht, wenn Sie Fortschritte gemacht haben, Ihre Arbeit zu committen und in Ihr Konto zu pushen, damit sie in der Pull-Anfrage erscheint.
451
+ damit sie in der Pull-Anfrage angezeigt wird. Außerdem sollten Sie darauf achten, dass Sie Ihre Arbeit von Zeit zu Zeit mit dem aktuellen main
452
+ von Zeit zu Zeit zu aktualisieren, indem Sie dies tun:
453
+
454
+ ```bash
455
+ git fetch upstream
456
+ git merge upstream/main
457
+ ```
458
+
459
+ Generell sollten Sie alle Fragen, die Sie in Bezug auf das Modell oder Ihre Implementierung haben, in Ihrem PR stellen und
460
+ in der PR diskutiert/gelöst werden. Auf diese Weise wird das Hugging Face Team immer benachrichtigt, wenn Sie neuen Code einreichen oder
461
+ wenn Sie eine Frage haben. Es ist oft sehr hilfreich, das Hugging Face-Team auf Ihren hinzugefügten Code hinzuweisen, damit das Hugging Face-Team Ihr Problem oder Ihre Frage besser verstehen kann.
462
+ Face-Team Ihr Problem oder Ihre Frage besser verstehen kann.
463
+
464
+ Gehen Sie dazu auf die Registerkarte "Geänderte Dateien", auf der Sie alle Ihre Änderungen sehen, gehen Sie zu einer Zeile, zu der Sie eine Frage stellen möchten
465
+ eine Frage stellen möchten, und klicken Sie auf das "+"-Symbol, um einen Kommentar hinzuzufügen. Wenn eine Frage oder ein Problem gelöst wurde,
466
+ können Sie auf die Schaltfläche "Lösen" des erstellten Kommentars klicken.
467
+
468
+ Auf dieselbe Weise wird das Hugging Face-Team Kommentare öffnen, wenn es Ihren Code überprüft. Wir empfehlen, die meisten Fragen
469
+ auf GitHub in Ihrem PR zu stellen. Für einige sehr allgemeine Fragen, die für die Öffentlichkeit nicht sehr nützlich sind, können Sie das
470
+ Hugging Face Team per Slack oder E-Mail zu stellen.
471
+
472
+ **5. Passen Sie den Code der generierten Modelle für brand_new_bert** an.
473
+
474
+ Zunächst werden wir uns nur auf das Modell selbst konzentrieren und uns nicht um den Tokenizer kümmern. Den gesamten relevanten Code sollten Sie
475
+ finden Sie in den generierten Dateien `src/transformers/models/brand_new_bert/modeling_brand_new_bert.py` und
476
+ `src/transformers/models/brand_new_bert/configuration_brand_new_bert.py`.
477
+
478
+ Jetzt können Sie endlich mit dem Programmieren beginnen :). Der generierte Code in
479
+ `src/transformers/models/brand_new_bert/modeling_brand_new_bert.py` wird entweder die gleiche Architektur wie BERT haben, wenn
480
+ wenn es sich um ein reines Encoder-Modell handelt oder BART, wenn es sich um ein Encoder-Decoder-Modell handelt. An diesem Punkt sollten Sie sich daran erinnern, was
481
+ was Sie am Anfang über die theoretischen Aspekte des Modells gelernt haben: *Wie unterscheidet sich das Modell von BERT oder
482
+ BART?*". Implementieren Sie diese Änderungen, was oft bedeutet, dass Sie die *Selbstaufmerksamkeitsschicht*, die Reihenfolge der Normalisierungsschicht usw. ändern müssen.
483
+ Schicht usw... Auch hier ist es oft nützlich, sich die ähnliche Architektur bereits bestehender Modelle in Transformers anzusehen, um ein besseres Gefühl dafür zu bekommen
484
+ ein besseres Gefühl dafür zu bekommen, wie Ihr Modell implementiert werden sollte.
485
+
486
+ **Beachten Sie**, dass Sie an diesem Punkt nicht sehr sicher sein müssen, dass Ihr Code völlig korrekt oder sauber ist. Vielmehr ist es
487
+ Sie sollten vielmehr eine erste *unbereinigte*, kopierte Version des ursprünglichen Codes in
488
+ src/transformers/models/brand_new_bert/modeling_brand_new_bert.py" hinzuzufügen, bis Sie das Gefühl haben, dass der gesamte notwendige Code
489
+ hinzugefügt wurde. Unserer Erfahrung nach ist es viel effizienter, schnell eine erste Version des erforderlichen Codes hinzuzufügen und
490
+ den Code iterativ mit dem Konvertierungsskript zu verbessern/korrigieren, wie im nächsten Abschnitt beschrieben. Das einzige, was
491
+ zu diesem Zeitpunkt funktionieren muss, ist, dass Sie die 🤗 Transformers-Implementierung von *brand_new_bert* instanziieren können, *d.h.* der
492
+ folgende Befehl sollte funktionieren:
493
+
494
+ ```python
495
+ from transformers import BrandNewBertModel, BrandNewBertConfig
496
+
497
+ model = BrandNewBertModel(BrandNewBertConfig())
498
+ ```
499
+
500
+ Der obige Befehl erstellt ein Modell gemäß den Standardparametern, die in `BrandNewBertConfig()` definiert sind, mit
501
+ zufälligen Gewichten und stellt damit sicher, dass die `init()` Methoden aller Komponenten funktionieren.
502
+
503
+ Beachten Sie, dass alle zufälligen Initialisierungen in der Methode `_init_weights` Ihres `BrandnewBertPreTrainedModel` stattfinden sollten.
504
+ Klasse erfolgen sollte. Sie sollte alle Blattmodule in Abhängigkeit von den Variablen der Konfiguration initialisieren. Hier ist ein Beispiel mit der
505
+ BERT `_init_weights` Methode:
506
+
507
+ ```py
508
+ def _init_weights(self, module):
509
+ """Initialize the weights"""
510
+ if isinstance(module, nn.Linear):
511
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
512
+ if module.bias is not None:
513
+ module.bias.data.zero_()
514
+ elif isinstance(module, nn.Embedding):
515
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
516
+ if module.padding_idx is not None:
517
+ module.weight.data[module.padding_idx].zero_()
518
+ elif isinstance(module, nn.LayerNorm):
519
+ module.bias.data.zero_()
520
+ module.weight.data.fill_(1.0)
521
+ ```
522
+
523
+ Sie können weitere benutzerdefinierte Schemata verwenden, wenn Sie eine spezielle Initialisierung für einige Module benötigen. Zum Beispiel in
524
+ `Wav2Vec2ForPreTraining` müssen die letzten beiden linearen Schichten die Initialisierung des regulären PyTorch `nn.Linear` haben.
525
+ aber alle anderen sollten eine Initialisierung wie oben verwenden. Dies ist wie folgt kodiert:
526
+
527
+ ```py
528
+ def _init_weights(self, module):
529
+ """Initialize the weights"""
530
+ if isinstance(module, Wav2Vec2ForPreTraining):
531
+ module.project_hid.reset_parameters()
532
+ module.project_q.reset_parameters()
533
+ module.project_hid._is_hf_initialized = True
534
+ module.project_q._is_hf_initialized = True
535
+ elif isinstance(module, nn.Linear):
536
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
537
+ if module.bias is not None:
538
+ module.bias.data.zero_()
539
+ ```
540
+
541
+ Das Flag `_is_hf_initialized` wird intern verwendet, um sicherzustellen, dass wir ein Submodul nur einmal initialisieren. Wenn Sie es auf
542
+ `True` für `module.project_q` und `module.project_hid` setzen, stellen wir sicher, dass die benutzerdefinierte Initialisierung, die wir vorgenommen haben, später nicht überschrieben wird,
543
+ die Funktion `_init_weights` nicht auf sie angewendet wird.
544
+
545
+ **6. Schreiben Sie ein Konvertierungsskript**
546
+
547
+ Als nächstes sollten Sie ein Konvertierungsskript schreiben, mit dem Sie den Checkpoint, den Sie zum Debuggen von *brand_new_bert* im
548
+ im ursprünglichen Repository in einen Prüfpunkt konvertieren, der mit Ihrer gerade erstellten 🤗 Transformers-Implementierung von
549
+ *brand_new_bert*. Es ist nicht ratsam, das Konvertierungsskript von Grund auf neu zu schreiben, sondern die bereits
550
+ bestehenden Konvertierungsskripten in 🤗 Transformers nach einem Skript zu suchen, das für die Konvertierung eines ähnlichen Modells verwendet wurde, das im
551
+ demselben Framework wie *brand_new_bert* geschrieben wurde. Normalerweise reicht es aus, ein bereits vorhandenes Konvertierungsskript zu kopieren und
552
+ es für Ihren Anwendungsfall leicht anzupassen. Zögern Sie nicht, das Hugging Face Team zu bitten, Sie auf ein ähnliches, bereits vorhandenes
553
+ Konvertierungsskript für Ihr Modell zu finden.
554
+
555
+ - Wenn Sie ein Modell von TensorFlow nach PyTorch portieren, ist ein guter Ausgangspunkt das Konvertierungsskript von BERT [hier](https://github.com/huggingface/transformers/blob/7acfa95afb8194f8f9c1f4d2c6028224dbed35a2/src/transformers/models/bert/modeling_bert.py#L91)
556
+ - Wenn Sie ein Modell von PyTorch nach PyTorch portieren, ist ein guter Ausgangspunkt das Konvertierungsskript von BART [hier](https://github.com/huggingface/transformers/blob/main/src/transformers/models/bart/convert_bart_original_pytorch_checkpoint_to_pytorch.py)
557
+
558
+ Im Folgenden werden wir kurz erklären, wie PyTorch-Modelle Ebenengewichte speichern und Ebenennamen definieren. In PyTorch wird der
559
+ Name einer Ebene durch den Namen des Klassenattributs definiert, das Sie der Ebene geben. Lassen Sie uns ein Dummy-Modell in
560
+ PyTorch, das wir `SimpleModel` nennen, wie folgt:
561
+
562
+ ```python
563
+ from torch import nn
564
+
565
+
566
+ class SimpleModel(nn.Module):
567
+ def __init__(self):
568
+ super().__init__()
569
+ self.dense = nn.Linear(10, 10)
570
+ self.intermediate = nn.Linear(10, 10)
571
+ self.layer_norm = nn.LayerNorm(10)
572
+ ```
573
+
574
+ Jetzt können wir eine Instanz dieser Modelldefinition erstellen, die alle Gewichte ausfüllt: `dense`, `intermediate`,
575
+ `layer_norm` mit zufälligen Gewichten. Wir können das Modell ausdrucken, um seine Architektur zu sehen
576
+
577
+ ```python
578
+ model = SimpleModel()
579
+
580
+ print(model)
581
+ ```
582
+
583
+ Dies gibt folgendes aus:
584
+
585
+ ```
586
+ SimpleModel(
587
+ (dense): Linear(in_features=10, out_features=10, bias=True)
588
+ (intermediate): Linear(in_features=10, out_features=10, bias=True)
589
+ (layer_norm): LayerNorm((10,), eps=1e-05, elementwise_affine=True)
590
+ )
591
+ ```
592
+
593
+ Wir können sehen, dass die Ebenennamen durch den Namen des Klassenattributs in PyTorch definiert sind. Sie können die Gewichtswerte
594
+ Werte einer bestimmten Ebene anzeigen lassen:
595
+
596
+ ```python
597
+ print(model.dense.weight.data)
598
+ ```
599
+
600
+ um zu sehen, dass die Gewichte zufällig initialisiert wurden
601
+
602
+ ```
603
+ tensor([[-0.0818, 0.2207, -0.0749, -0.0030, 0.0045, -0.1569, -0.1598, 0.0212,
604
+ -0.2077, 0.2157],
605
+ [ 0.1044, 0.0201, 0.0990, 0.2482, 0.3116, 0.2509, 0.2866, -0.2190,
606
+ 0.2166, -0.0212],
607
+ [-0.2000, 0.1107, -0.1999, -0.3119, 0.1559, 0.0993, 0.1776, -0.1950,
608
+ -0.1023, -0.0447],
609
+ [-0.0888, -0.1092, 0.2281, 0.0336, 0.1817, -0.0115, 0.2096, 0.1415,
610
+ -0.1876, -0.2467],
611
+ [ 0.2208, -0.2352, -0.1426, -0.2636, -0.2889, -0.2061, -0.2849, -0.0465,
612
+ 0.2577, 0.0402],
613
+ [ 0.1502, 0.2465, 0.2566, 0.0693, 0.2352, -0.0530, 0.1859, -0.0604,
614
+ 0.2132, 0.1680],
615
+ [ 0.1733, -0.2407, -0.1721, 0.1484, 0.0358, -0.0633, -0.0721, -0.0090,
616
+ 0.2707, -0.2509],
617
+ [-0.1173, 0.1561, 0.2945, 0.0595, -0.1996, 0.2988, -0.0802, 0.0407,
618
+ 0.1829, -0.1568],
619
+ [-0.1164, -0.2228, -0.0403, 0.0428, 0.1339, 0.0047, 0.1967, 0.2923,
620
+ 0.0333, -0.0536],
621
+ [-0.1492, -0.1616, 0.1057, 0.1950, -0.2807, -0.2710, -0.1586, 0.0739,
622
+ 0.2220, 0.2358]]).
623
+ ```
624
+
625
+ Im Konvertierungsskript sollten Sie diese zufällig initialisierten Gewichte mit den genauen Gewichten der
626
+ entsprechenden Ebene im Kontrollpunkt. *Z.B.*
627
+
628
+ ```python
629
+ # retrieve matching layer weights, e.g. by
630
+ # recursive algorithm
631
+ layer_name = "dense"
632
+ pretrained_weight = array_of_dense_layer
633
+
634
+ model_pointer = getattr(model, "dense")
635
+
636
+ model_pointer.weight.data = torch.from_numpy(pretrained_weight)
637
+ ```
638
+
639
+ Dabei müssen Sie sicherstellen, dass jedes zufällig initialisierte Gewicht Ihres PyTorch-Modells und sein entsprechendes
640
+ Checkpoint-Gewicht in **Form und Name** genau übereinstimmen. Zu diesem Zweck ist es **notwendig**, assert
641
+ Anweisungen für die Form hinzuzufügen und die Namen der Checkpoint-Gewichte auszugeben. Sie sollten z.B. Anweisungen hinzufügen wie:
642
+
643
+ ```python
644
+ assert (
645
+ model_pointer.weight.shape == pretrained_weight.shape
646
+ ), f"Pointer shape of random weight {model_pointer.shape} and array shape of checkpoint weight {pretrained_weight.shape} mismatched"
647
+ ```
648
+
649
+ Außerdem sollten Sie die Namen der beiden Gewichte ausdrucken, um sicherzustellen, dass sie übereinstimmen, *z.B.*.
650
+
651
+ ```python
652
+ logger.info(f"Initialize PyTorch weight {layer_name} from {pretrained_weight.name}")
653
+ ```
654
+
655
+ Wenn entweder die Form oder der Name nicht übereinstimmt, haben Sie wahrscheinlich das falsche Kontrollpunktgewicht einer zufällig
656
+ Ebene der 🤗 Transformers-Implementierung zugewiesen.
657
+
658
+ Eine falsche Form ist höchstwahrscheinlich auf eine falsche Einstellung der Konfigurationsparameter in `BrandNewBertConfig()` zurückzuführen, die
659
+ nicht genau mit denen übereinstimmen, die für den zu konvertierenden Prüfpunkt verwendet wurden. Es könnte aber auch sein, dass
660
+ die PyTorch-Implementierung eines Layers erfordert, dass das Gewicht vorher transponiert wird.
661
+
662
+ Schließlich sollten Sie auch überprüfen, ob **alle** erforderlichen Gewichte initialisiert sind und alle Checkpoint-Gewichte ausgeben, die
663
+ die nicht zur Initialisierung verwendet wurden, um sicherzustellen, dass das Modell korrekt konvertiert wurde. Es ist völlig normal, dass die
664
+ Konvertierungsversuche entweder mit einer falschen Shape-Anweisung oder einer falschen Namenszuweisung fehlschlagen. Das liegt höchstwahrscheinlich daran, dass entweder
665
+ Sie haben falsche Parameter in `BrandNewBertConfig()` verwendet, haben eine falsche Architektur in der 🤗 Transformers
666
+ Implementierung, Sie haben einen Fehler in den `init()` Funktionen einer der Komponenten der 🤗 Transformers
667
+ Implementierung oder Sie müssen eine der Kontrollpunktgewichte transponieren.
668
+
669
+ Dieser Schritt sollte mit dem vorherigen Schritt wiederholt werden, bis alle Gewichte des Kontrollpunkts korrekt in das
670
+ Transformers-Modell geladen sind. Nachdem Sie den Prüfpunkt korrekt in die 🤗 Transformers-Implementierung geladen haben, können Sie das Modell
671
+ das Modell unter einem Ordner Ihrer Wahl `/path/to/converted/checkpoint/folder` speichern, der dann sowohl ein
672
+ Datei `pytorch_model.bin` und eine Datei `config.json` enthalten sollte:
673
+
674
+ ```python
675
+ model.save_pretrained("/path/to/converted/checkpoint/folder")
676
+ ```
677
+
678
+ **7. Implementieren Sie den Vorwärtspass**
679
+
680
+ Nachdem es Ihnen gelungen ist, die trainierten Gewichte korrekt in die 🤗 Transformers-Implementierung zu laden, sollten Sie nun dafür sorgen
681
+ sicherstellen, dass der Forward Pass korrekt implementiert ist. In [Machen Sie sich mit dem ursprünglichen Repository vertraut](#3-4-führen-sie-einen-pre-training-checkpoint-mit-dem-original-repository-durch) haben Sie bereits ein Skript erstellt, das einen Forward Pass
682
+ Durchlauf des Modells unter Verwendung des Original-Repositorys durchführt. Jetzt sollten Sie ein analoges Skript schreiben, das die 🤗 Transformers
683
+ Implementierung anstelle der Originalimplementierung verwenden. Es sollte wie folgt aussehen:
684
+
685
+ ```python
686
+ model = BrandNewBertModel.from_pretrained("/path/to/converted/checkpoint/folder")
687
+ input_ids = [0, 4, 4, 3, 2, 4, 1, 7, 19]
688
+ output = model(input_ids).last_hidden_states
689
+ ```
690
+
691
+ Es ist sehr wahrscheinlich, dass die 🤗 Transformers-Implementierung und die ursprüngliche Modell-Implementierung nicht genau die gleiche Ausgabe liefern.
692
+ beim ersten Mal nicht die gleiche Ausgabe liefern oder dass der Vorwärtsdurchlauf einen Fehler auslöst. Seien Sie nicht enttäuscht - das ist zu erwarten! Erstens,
693
+ sollten Sie sicherstellen, dass der Vorwärtsdurchlauf keine Fehler auslöst. Es passiert oft, dass die falschen Dimensionen verwendet werden
694
+ verwendet werden, was zu einem *Dimensionality mismatch* Fehler führt oder dass der falsche Datentyp verwendet wird, *z.B.* `torch.long`
695
+ anstelle von `torch.float32`. Zögern Sie nicht, das Hugging Face Team um Hilfe zu bitten, wenn Sie bestimmte Fehler nicht lösen können.
696
+ bestimmte Fehler nicht lösen können.
697
+
698
+ Um sicherzustellen, dass die Implementierung von 🤗 Transformers korrekt funktioniert, müssen Sie sicherstellen, dass die Ausgaben
699
+ einer Genauigkeit von `1e-3` entsprechen. Zunächst sollten Sie sicherstellen, dass die Ausgabeformen identisch sind, *d.h.*.
700
+ Die Ausgabeform *outputs.shape* sollte für das Skript der 🤗 Transformers-Implementierung und die ursprüngliche
701
+ Implementierung ergeben. Als nächstes sollten Sie sicherstellen, dass auch die Ausgabewerte identisch sind. Dies ist einer der schwierigsten
702
+ Teile des Hinzufügens eines neuen Modells. Häufige Fehler, warum die Ausgaben nicht identisch sind, sind:
703
+
704
+ - Einige Ebenen wurden nicht hinzugefügt, *d.h.* eine *Aktivierungsebene* wurde nicht hinzugefügt, oder die Restverbindung wurde vergessen
705
+ - Die Worteinbettungsmatrix wurde nicht gebunden
706
+ - Es werden die falschen Positionseinbettungen verwendet, da die ursprüngliche Implementierung einen Offset verwendet
707
+ - Dropout wird während des Vorwärtsdurchlaufs angewendet. Um dies zu beheben, stellen Sie sicher, dass *model.training auf False* steht und dass keine Dropout
708
+ Schicht während des Vorwärtsdurchlaufs fälschlicherweise aktiviert wird, *d.h.* übergeben Sie *self.training* an [PyTorch's functional dropout](https://pytorch.org/docs/stable/nn.functional.html?highlight=dropout#torch.nn.functional.dropout)
709
+
710
+ Der beste Weg, das Problem zu beheben, besteht normalerweise darin, sich den Vorwärtsdurchlauf der ursprünglichen Implementierung und die 🤗
711
+ Transformers-Implementierung nebeneinander zu sehen und zu prüfen, ob es Unterschiede gibt. Idealerweise sollten Sie die
712
+ Zwischenergebnisse beider Implementierungen des Vorwärtsdurchlaufs debuggen/ausdrucken, um die genaue Position im Netzwerk zu finden, an der die 🤗
713
+ Transformers-Implementierung eine andere Ausgabe zeigt als die ursprüngliche Implementierung. Stellen Sie zunächst sicher, dass die
714
+ hartcodierten `input_ids` in beiden Skripten identisch sind. Überprüfen Sie dann, ob die Ausgaben der ersten Transformation von
715
+ der `input_ids` (normalerweise die Worteinbettungen) identisch sind. Und dann arbeiten Sie sich bis zur allerletzten Schicht des
716
+ Netzwerks. Irgendwann werden Sie einen Unterschied zwischen den beiden Implementierungen feststellen, der Sie auf den Fehler
717
+ in der Implementierung von 🤗 Transformers hinweist. Unserer Erfahrung nach ist ein einfacher und effizienter Weg, viele Druckanweisungen hinzuzufügen
718
+ sowohl in der Original-Implementierung als auch in der 🤗 Transformers-Implementierung an den gleichen Stellen im Netzwerk
719
+ hinzuzufügen und nacheinander Druckanweisungen zu entfernen, die dieselben Werte für Zwischenpräsentationen anzeigen.
720
+
721
+ Wenn Sie sicher sind, dass beide Implementierungen die gleiche Ausgabe liefern, überprüfen Sie die Ausgaben mit
722
+ `torch.allclose(original_output, output, atol=1e-3)` überprüfen, haben Sie den schwierigsten Teil hinter sich! Herzlichen Glückwunsch - die
723
+ Arbeit, die noch zu erledigen ist, sollte ein Kinderspiel sein 😊.
724
+
725
+ **8. Hinzufügen aller notwendigen Modelltests**
726
+
727
+ An diesem Punkt haben Sie erfolgreich ein neues Modell hinzugefügt. Es ist jedoch sehr gut möglich, dass das Modell noch nicht
728
+ noch nicht vollständig mit dem erforderlichen Design übereinstimmt. Um sicherzustellen, dass die Implementierung vollständig kompatibel mit 🤗 Transformers ist, sollten alle
729
+ gemeinsamen Tests bestehen. Der Cookiecutter sollte automatisch eine Testdatei für Ihr Modell hinzugefügt haben, wahrscheinlich unter
730
+ demselben `tests/models/brand_new_bert/test_modeling_brand_new_bert.py`. Führen Sie diese Testdatei aus, um zu überprüfen, ob alle gängigen
731
+ Tests bestehen:
732
+
733
+ ```bash
734
+ pytest tests/models/brand_new_bert/test_modeling_brand_new_bert.py
735
+ ```
736
+
737
+ Nachdem Sie alle allgemeinen Tests festgelegt haben, müssen Sie nun sicherstellen, dass all die schöne Arbeit, die Sie geleistet haben, gut getestet ist, damit
738
+
739
+ - a) die Community Ihre Arbeit leicht nachvollziehen kann, indem sie sich spezifische Tests von *brand_new_bert* ansieht
740
+ - b) zukünftige Änderungen an Ihrem Modell keine wichtigen Funktionen des Modells zerstören.
741
+
742
+ Als erstes sollten Sie Integrationstests hinzufügen. Diese Integrationstests tun im Wesentlichen dasselbe wie die Debugging-Skripte
743
+ die Sie zuvor zur Implementierung des Modells in 🤗 Transformers verwendet haben. Eine Vorlage für diese Modelltests wurde bereits von dem
744
+ Cookiecutter hinzugefügt, die `BrandNewBertModelIntegrationTests` heißt und nur noch von Ihnen ausgefüllt werden muss. Um sicherzustellen, dass diese
745
+ Tests erfolgreich sind, führen Sie
746
+
747
+ ```bash
748
+ RUN_SLOW=1 pytest -sv tests/models/brand_new_bert/test_modeling_brand_new_bert.py::BrandNewBertModelIntegrationTests
749
+ ```
750
+
751
+ <Tip>
752
+
753
+ Falls Sie Windows verwenden, sollten Sie `RUN_SLOW=1` durch `SET RUN_SLOW=1` ersetzen.
754
+
755
+ </Tip>
756
+
757
+ Zweitens sollten alle Funktionen, die speziell für *brand_new_bert* sind, zusätzlich in einem separaten Test getestet werden unter
758
+ `BrandNewBertModelTester`/`BrandNewBertModelTest`. Dieser Teil wird oft vergessen, ist aber in zweierlei Hinsicht äußerst nützlich
759
+ Weise:
760
+
761
+ - Er hilft dabei, das Wissen, das Sie während der Modellerweiterung erworben haben, an die Community weiterzugeben, indem er zeigt, wie die
762
+ speziellen Funktionen von *brand_new_bert* funktionieren sollten.
763
+ - Künftige Mitwirkende können Änderungen am Modell schnell testen, indem sie diese speziellen Tests ausführen.
764
+
765
+
766
+ **9. Implementieren Sie den Tokenizer**
767
+
768
+ Als nächstes sollten wir den Tokenizer von *brand_new_bert* hinzufügen. Normalerweise ist der Tokenizer äquivalent oder sehr ähnlich zu einem
769
+ bereits vorhandenen Tokenizer von 🤗 Transformers.
770
+
771
+ Es ist sehr wichtig, die ursprüngliche Tokenizer-Datei zu finden/extrahieren und es zu schaffen, diese Datei in die 🤗
772
+ Transformers Implementierung des Tokenizers zu laden.
773
+
774
+ Um sicherzustellen, dass der Tokenizer korrekt funktioniert, empfiehlt es sich, zunächst ein Skript im ursprünglichen Repository zu erstellen
775
+ zu erstellen, das eine Zeichenkette eingibt und die `input_ids` zurückgibt. Es könnte etwa so aussehen (in Pseudocode):
776
+
777
+ ```python
778
+ input_str = "This is a long example input string containing special characters .$?-, numbers 2872 234 12 and words."
779
+ model = BrandNewBertModel.load_pretrained_checkpoint("/path/to/checkpoint/")
780
+ input_ids = model.tokenize(input_str)
781
+ ```
782
+
783
+ Möglicherweise müssen Sie noch einmal einen Blick in das ursprüngliche Repository werfen, um die richtige Tokenizer-Funktion zu finden, oder Sie müssen
784
+ Sie müssen vielleicht sogar Änderungen an Ihrem Klon des Original-Repositorys vornehmen, um nur die `input_ids` auszugeben. Nach dem Schreiben
785
+ ein funktionierendes Tokenisierungsskript geschrieben, das das ursprüngliche Repository verwendet, sollten Sie ein analoges Skript für 🤗 Transformers
786
+ erstellt werden. Es sollte ähnlich wie dieses aussehen:
787
+
788
+ ```python
789
+ from transformers import BrandNewBertTokenizer
790
+
791
+ input_str = "This is a long example input string containing special characters .$?-, numbers 2872 234 12 and words."
792
+
793
+ tokenizer = BrandNewBertTokenizer.from_pretrained("/path/to/tokenizer/folder/")
794
+
795
+ input_ids = tokenizer(input_str).input_ids
796
+ ```
797
+
798
+ Wenn beide `input_ids` die gleichen Werte ergeben, sollte als letzter Schritt auch eine Tokenizer-Testdatei hinzugefügt werden.
799
+
800
+ Analog zu den Modellierungstestdateien von *brand_new_bert* sollten auch die Tokenisierungs-Testdateien von *brand_new_bert*
801
+ eine Reihe von fest kodierten Integrationstests enthalten.
802
+
803
+ **10. Führen Sie End-to-End-Integrationstests aus**
804
+
805
+ Nachdem Sie den Tokenizer hinzugefügt haben, sollten Sie auch ein paar End-to-End-Integrationstests, die sowohl das Modell als auch den
806
+ Tokenizer zu `tests/models/brand_new_bert/test_modeling_brand_new_bert.py` in 🤗 Transformers.
807
+ Ein solcher Test sollte bei einem aussagekräftigen
808
+ Text-zu-Text-Beispiel zeigen, dass die Implementierung von 🤗 Transformers wie erwartet funktioniert. Ein aussagekräftiges Text-zu-Text-Beispiel kann
809
+ z.B. *ein Quell-zu-Ziel-Übersetzungspaar, ein Artikel-zu-Zusammenfassung-Paar, ein Frage-zu-Antwort-Paar, usw... Wenn keiner der
810
+ der portierten Prüfpunkte in einer nachgelagerten Aufgabe feinabgestimmt wurde, genügt es, sich einfach auf die Modelltests zu verlassen. In einem
811
+ letzten Schritt, um sicherzustellen, dass das Modell voll funktionsfähig ist, sollten Sie alle Tests auch auf der GPU durchführen. Es kann
812
+ Es kann vorkommen, dass Sie vergessen haben, einige `.to(self.device)` Anweisungen zu internen Tensoren des Modells hinzuzufügen, was in einem solchen
813
+ Test zu einem Fehler führen würde. Falls Sie keinen Zugang zu einem Grafikprozessor haben, kann das Hugging Face Team diese Tests für Sie durchführen.
814
+ Tests für Sie übernehmen.
815
+
816
+ **11. Docstring hinzufügen**
817
+
818
+ Nun sind alle notwendigen Funktionen für *brand_new_bert* hinzugefügt - Sie sind fast fertig! Das Einzige, was Sie noch hinzufügen müssen, ist
819
+ ein schöner Docstring und eine Doku-Seite. Der Cookiecutter sollte eine Vorlagendatei namens
820
+ `docs/source/model_doc/brand_new_bert.md` hinzugefügt haben, die Sie ausfüllen sollten. Die Benutzer Ihres Modells werden in der Regel zuerst einen Blick auf
821
+ diese Seite ansehen, bevor sie Ihr Modell verwenden. Daher muss die Dokumentation verständlich und prägnant sein. Es ist sehr nützlich für
822
+ die Gemeinschaft, einige *Tipps* hinzuzufügen, um zu zeigen, wie das Modell verwendet werden sollte. Zögern Sie nicht, das Hugging Face-Team anzupingen
823
+ bezüglich der Docstrings.
824
+
825
+ Stellen Sie als nächstes sicher, dass der zu `src/transformers/models/brand_new_bert/modeling_brand_new_bert.py` hinzugefügte docstring
826
+ korrekt ist und alle erforderlichen Eingaben und Ausgaben enthält. Wir haben eine ausführliche Anleitung zum Schreiben von Dokumentationen und unserem Docstring-Format [hier](writing-documentation). Es ist immer gut, sich daran zu erinnern, dass die Dokumentation
827
+ mindestens so sorgfältig behandelt werden sollte wie der Code in 🤗 Transformers, denn die Dokumentation ist in der Regel der erste Kontaktpunkt der
828
+ Berührungspunkt der Community mit dem Modell ist.
829
+
830
+ **Code refactor**
831
+
832
+ Großartig, jetzt haben Sie den gesamten erforderlichen Code für *brand_new_bert* hinzugefügt. An diesem Punkt sollten Sie einige mögliche
833
+ falschen Codestil korrigieren, indem Sie ausführen:
834
+
835
+ ```bash
836
+ make style
837
+ ```
838
+
839
+ und überprüfen Sie, ob Ihr Kodierungsstil die Qualitätsprüfung besteht:
840
+
841
+ ```bash
842
+ make quality
843
+ ```
844
+
845
+ Es gibt noch ein paar andere sehr strenge Designtests in 🤗 Transformers, die möglicherweise noch fehlschlagen, was sich in den
846
+ den Tests Ihres Pull Requests. Dies liegt oft an fehlenden Informationen im Docstring oder an einer falschen
847
+ Benennung. Das Hugging Face Team wird Ihnen sicherlich helfen, wenn Sie hier nicht weiterkommen.
848
+
849
+ Und schließlich ist es immer eine gute Idee, den eigenen Code zu refaktorisieren, nachdem man sichergestellt hat, dass er korrekt funktioniert. Wenn alle
850
+ Tests bestanden haben, ist es nun an der Zeit, den hinzugefügten Code noch einmal durchzugehen und einige Überarbeitungen vorzunehmen.
851
+
852
+ Sie haben nun den Codierungsteil abgeschlossen, herzlichen Glückwunsch! 🎉 Sie sind großartig! 😎
853
+
854
+ **12. Laden Sie die Modelle in den Model Hub hoch**
855
+
856
+ In diesem letzten Teil sollten Sie alle Checkpoints konvertieren und in den Modell-Hub hochladen und eine Modellkarte für jeden
857
+ hochgeladenen Modell-Kontrollpunkt. Sie können sich mit den Hub-Funktionen vertraut machen, indem Sie unsere [Model sharing and uploading Page](model_sharing) lesen. Hier sollten Sie mit dem Hugging Face-Team zusammenarbeiten, um einen passenden Namen für jeden
858
+ Checkpoint festzulegen und die erforderlichen Zugriffsrechte zu erhalten, um das Modell unter der Organisation des Autors *brand_new_bert* hochladen zu können.
859
+ *brand_new_bert*. Die Methode `push_to_hub`, die in allen Modellen in `transformers` vorhanden ist, ist ein schneller und effizienter Weg, Ihren Checkpoint in den Hub zu pushen. Ein kleines Snippet ist unten eingefügt:
860
+
861
+ ```python
862
+ brand_new_bert.push_to_hub("brand_new_bert")
863
+ # Uncomment the following line to push to an organization.
864
+ # brand_new_bert.push_to_hub("<organization>/brand_new_bert")
865
+ ```
866
+
867
+ Es lohnt sich, etwas Zeit darauf zu verwenden, für jeden Kontrollpunkt passende Musterkarten zu erstellen. Die Modellkarten sollten die
868
+ spezifischen Merkmale dieses bestimmten Prüfpunkts hervorheben, * z.B.* auf welchem Datensatz wurde der Prüfpunkt
869
+ vortrainiert/abgestimmt? Für welche nachgelagerte Aufgabe sollte das Modell verwendet werden? Und fügen Sie auch etwas Code bei, wie Sie
870
+ wie das Modell korrekt verwendet wird.
871
+
872
+ **13. (Optional) Notizbuch hinzufügen**
873
+
874
+ Es ist sehr hilfreich, ein Notizbuch hinzuzufügen, in dem im Detail gezeigt wird, wie *brand_new_bert* für Schlussfolgerungen verwendet werden kann und/oder
875
+ bei einer nachgelagerten Aufgabe feinabgestimmt wird. Dies ist nicht zwingend erforderlich, um Ihren PR zusammenzuführen, aber sehr nützlich für die Gemeinschaft.
876
+
877
+ **14. Reichen Sie Ihren fertigen PR ein**
878
+
879
+ Sie sind jetzt mit der Programmierung fertig und können zum letzten Schritt übergehen, nämlich der Zusammenführung Ihres PR mit main. Normalerweise hat das
880
+ Hugging Face Team Ihnen an diesem Punkt bereits geholfen haben, aber es lohnt sich, sich etwas Zeit zu nehmen, um Ihrem fertigen
881
+ PR eine schöne Beschreibung zu geben und eventuell Kommentare zu Ihrem Code hinzuzufügen, wenn Sie Ihren Gutachter auf bestimmte Designentscheidungen hinweisen wollen.
882
+ Gutachter hinweisen wollen.
883
+
884
+ ### Teilen Sie Ihre Arbeit!!
885
+
886
+ Jetzt ist es an der Zeit, von der Community Anerkennung für Ihre Arbeit zu bekommen! Die Fertigstellung einer Modellergänzung ist ein wichtiger
887
+ Beitrag zu Transformers und der gesamten NLP-Gemeinschaft. Ihr Code und die portierten vortrainierten Modelle werden sicherlich
888
+ von Hunderten und vielleicht sogar Tausenden von Entwicklern und Forschern genutzt werden. Sie sollten stolz auf Ihre Arbeit sein und Ihre
889
+ Ihre Leistung mit der Gemeinschaft teilen.
890
+
891
+ **Sie haben ein weiteres Modell erstellt, das für jeden in der Community super einfach zugänglich ist! 🤯**
docs/source/de/add_new_pipeline.md ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+
11
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
12
+ rendered properly in your Markdown viewer.
13
+
14
+ -->
15
+
16
+ # Wie erstellt man eine benutzerdefinierte Pipeline?
17
+
18
+ In dieser Anleitung sehen wir uns an, wie Sie eine benutzerdefinierte Pipeline erstellen und sie auf dem [Hub](https://hf.co/models) freigeben oder sie der
19
+ 🤗 Transformers-Bibliothek hinzufügen.
20
+
21
+ Zuallererst müssen Sie entscheiden, welche Roheingaben die Pipeline verarbeiten kann. Es kann sich um Strings, rohe Bytes,
22
+ Dictionaries oder was auch immer die wahrscheinlichste gewünschte Eingabe ist. Versuchen Sie, diese Eingaben so rein wie möglich in Python zu halten
23
+ denn das macht die Kompatibilität einfacher (auch mit anderen Sprachen über JSON). Dies werden die Eingaben der
24
+ Pipeline (`Vorverarbeitung`).
25
+
26
+ Definieren Sie dann die `Outputs`. Dieselbe Richtlinie wie für die Eingänge. Je einfacher, desto besser. Dies werden die Ausgaben der
27
+ Methode `Postprocess`.
28
+
29
+ Beginnen Sie damit, die Basisklasse `Pipeline` mit den 4 Methoden zu erben, die für die Implementierung von `preprocess` benötigt werden,
30
+ Weiterleiten", "Nachbearbeitung" und "Parameter säubern".
31
+
32
+
33
+ ```python
34
+ from transformers import Pipeline
35
+
36
+
37
+ class MyPipeline(Pipeline):
38
+ def _sanitize_parameters(self, **kwargs):
39
+ preprocess_kwargs = {}
40
+ if "maybe_arg" in kwargs:
41
+ preprocess_kwargs["maybe_arg"] = kwargs["maybe_arg"]
42
+ return preprocess_kwargs, {}, {}
43
+
44
+ def preprocess(self, inputs, maybe_arg=2):
45
+ model_input = Tensor(inputs["input_ids"])
46
+ return {"model_input": model_input}
47
+
48
+ def _forward(self, model_inputs):
49
+ # model_inputs == {"model_input": model_input}
50
+ outputs = self.model(**model_inputs)
51
+ # Maybe {"logits": Tensor(...)}
52
+ return outputs
53
+
54
+ def postprocess(self, model_outputs):
55
+ best_class = model_outputs["logits"].softmax(-1)
56
+ return best_class
57
+ ```
58
+
59
+ Die Struktur dieser Aufteilung soll eine relativ nahtlose Unterstützung für CPU/GPU ermöglichen und gleichzeitig die Durchführung von
60
+ Vor-/Nachbearbeitung auf der CPU in verschiedenen Threads
61
+
62
+ Preprocess" nimmt die ursprünglich definierten Eingaben und wandelt sie in etwas um, das in das Modell eingespeist werden kann. Es kann
63
+ mehr Informationen enthalten und ist normalerweise ein `Dict`.
64
+
65
+ `_forward` ist das Implementierungsdetail und ist nicht dafür gedacht, direkt aufgerufen zu werden. Weiterleiten" ist die bevorzugte
66
+ aufgerufene Methode, da sie Sicherheitsvorkehrungen enthält, die sicherstellen, dass alles auf dem erwarteten Gerät funktioniert. Wenn etwas
67
+ mit einem realen Modell verknüpft ist, gehört es in die Methode `_forward`, alles andere gehört in die Methoden preprocess/postprocess.
68
+
69
+ Die Methode `Postprocess` nimmt die Ausgabe von `_forward` und verwandelt sie in die endgültige Ausgabe, die zuvor festgelegt wurde.
70
+ zuvor entschieden wurde.
71
+
72
+ Die Methode `_sanitize_parameters` ermöglicht es dem Benutzer, beliebige Parameter zu übergeben, wann immer er möchte, sei es bei der Initialisierung
73
+ Zeit `pipeline(...., maybe_arg=4)` oder zur Aufrufzeit `pipe = pipeline(...); output = pipe(...., maybe_arg=4)`.
74
+
75
+ Die Rückgabe von `_sanitize_parameters` sind die 3 Dicts von kwargs, die direkt an `preprocess` übergeben werden,
76
+ `_forward` und `postprocess` übergeben werden. Füllen Sie nichts aus, wenn der Aufrufer keinen zusätzlichen Parameter angegeben hat. Das
77
+ erlaubt es, die Standardargumente in der Funktionsdefinition beizubehalten, was immer "natürlicher" ist.
78
+
79
+ Ein klassisches Beispiel wäre das Argument `top_k` in der Nachbearbeitung bei Klassifizierungsaufgaben.
80
+
81
+ ```python
82
+ >>> pipe = pipeline("my-new-task")
83
+ >>> pipe("This is a test")
84
+ [{"label": "1-star", "score": 0.8}, {"label": "2-star", "score": 0.1}, {"label": "3-star", "score": 0.05}
85
+ {"label": "4-star", "score": 0.025}, {"label": "5-star", "score": 0.025}]
86
+
87
+ >>> pipe("This is a test", top_k=2)
88
+ [{"label": "1-star", "score": 0.8}, {"label": "2-star", "score": 0.1}]
89
+ ```
90
+
91
+ In order to achieve that, we'll update our `postprocess` method with a default parameter to `5`. and edit
92
+ `_sanitize_parameters` to allow this new parameter.
93
+
94
+
95
+ ```python
96
+ def postprocess(self, model_outputs, top_k=5):
97
+ best_class = model_outputs["logits"].softmax(-1)
98
+ # Add logic to handle top_k
99
+ return best_class
100
+
101
+
102
+ def _sanitize_parameters(self, **kwargs):
103
+ preprocess_kwargs = {}
104
+ if "maybe_arg" in kwargs:
105
+ preprocess_kwargs["maybe_arg"] = kwargs["maybe_arg"]
106
+
107
+ postprocess_kwargs = {}
108
+ if "top_k" in kwargs:
109
+ postprocess_kwargs["top_k"] = kwargs["top_k"]
110
+ return preprocess_kwargs, {}, postprocess_kwargs
111
+ ```
112
+
113
+ Versuchen Sie, die Eingaben/Ausgaben sehr einfach und idealerweise JSON-serialisierbar zu halten, da dies die Verwendung der Pipeline sehr einfach macht
114
+ ohne dass die Benutzer neue Arten von Objekten verstehen müssen. Es ist auch relativ üblich, viele verschiedene Arten von Argumenten zu unterstützen
115
+ von Argumenten zu unterstützen (Audiodateien, die Dateinamen, URLs oder reine Bytes sein können).
116
+
117
+
118
+
119
+ ## Hinzufügen zur Liste der unterstützten Aufgaben
120
+
121
+ Um Ihre `neue Aufgabe` in die Liste der unterstützten Aufgaben aufzunehmen, müssen Sie sie zur `PIPELINE_REGISTRY` hinzufügen:
122
+
123
+ ```python
124
+ from transformers.pipelines import PIPELINE_REGISTRY
125
+
126
+ PIPELINE_REGISTRY.register_pipeline(
127
+ "new-task",
128
+ pipeline_class=MyPipeline,
129
+ pt_model=AutoModelForSequenceClassification,
130
+ )
131
+ ```
132
+
133
+ Wenn Sie möchten, können Sie ein Standardmodell angeben. In diesem Fall sollte es mit einer bestimmten Revision (die der Name einer Verzweigung oder ein Commit-Hash sein kann, hier haben wir `"abcdef"` genommen) sowie mit dem Typ versehen sein:
134
+
135
+ ```python
136
+ PIPELINE_REGISTRY.register_pipeline(
137
+ "new-task",
138
+ pipeline_class=MyPipeline,
139
+ pt_model=AutoModelForSequenceClassification,
140
+ default={"pt": ("user/awesome_model", "abcdef")},
141
+ type="text", # current support type: text, audio, image, multimodal
142
+ )
143
+ ```
144
+
145
+ ## Teilen Sie Ihre Pipeline auf dem Hub
146
+
147
+ Um Ihre benutzerdefinierte Pipeline auf dem Hub freizugeben, müssen Sie lediglich den benutzerdefinierten Code Ihrer `Pipeline`-Unterklasse in einer
148
+ Python-Datei speichern. Nehmen wir zum Beispiel an, Sie möchten eine benutzerdefinierte Pipeline für die Klassifizierung von Satzpaaren wie folgt verwenden:
149
+
150
+ ```py
151
+ import numpy as np
152
+
153
+ from transformers import Pipeline
154
+
155
+
156
+ def softmax(outputs):
157
+ maxes = np.max(outputs, axis=-1, keepdims=True)
158
+ shifted_exp = np.exp(outputs - maxes)
159
+ return shifted_exp / shifted_exp.sum(axis=-1, keepdims=True)
160
+
161
+
162
+ class PairClassificationPipeline(Pipeline):
163
+ def _sanitize_parameters(self, **kwargs):
164
+ preprocess_kwargs = {}
165
+ if "second_text" in kwargs:
166
+ preprocess_kwargs["second_text"] = kwargs["second_text"]
167
+ return preprocess_kwargs, {}, {}
168
+
169
+ def preprocess(self, text, second_text=None):
170
+ return self.tokenizer(text, text_pair=second_text, return_tensors=self.framework)
171
+
172
+ def _forward(self, model_inputs):
173
+ return self.model(**model_inputs)
174
+
175
+ def postprocess(self, model_outputs):
176
+ logits = model_outputs.logits[0].numpy()
177
+ probabilities = softmax(logits)
178
+
179
+ best_class = np.argmax(probabilities)
180
+ label = self.model.config.id2label[best_class]
181
+ score = probabilities[best_class].item()
182
+ logits = logits.tolist()
183
+ return {"label": label, "score": score, "logits": logits}
184
+ ```
185
+
186
+ Die Implementierung ist Framework-unabhängig und funktioniert für PyTorch- und TensorFlow-Modelle. Wenn wir dies in einer Datei
187
+ einer Datei namens `pair_classification.py` gespeichert haben, können wir sie importieren und wie folgt registrieren:
188
+
189
+ ```py
190
+ from pair_classification import PairClassificationPipeline
191
+ from transformers.pipelines import PIPELINE_REGISTRY
192
+ from transformers import AutoModelForSequenceClassification, TFAutoModelForSequenceClassification
193
+
194
+ PIPELINE_REGISTRY.register_pipeline(
195
+ "pair-classification",
196
+ pipeline_class=PairClassificationPipeline,
197
+ pt_model=AutoModelForSequenceClassification,
198
+ tf_model=TFAutoModelForSequenceClassification,
199
+ )
200
+ ```
201
+
202
+ Sobald dies geschehen ist, können wir es mit einem vortrainierten Modell verwenden. Zum Beispiel wurde `sgugger/finetuned-bert-mrpc` auf den
203
+ auf den MRPC-Datensatz abgestimmt, der Satzpaare als Paraphrasen oder nicht klassifiziert.
204
+
205
+ ```py
206
+ from transformers import pipeline
207
+
208
+ classifier = pipeline("pair-classification", model="sgugger/finetuned-bert-mrpc")
209
+ ```
210
+
211
+ Dann können wir sie auf dem Hub mit der Methode `push_to_hub` freigeben:
212
+
213
+ ```py
214
+ classifier.push_to_hub("test-dynamic-pipeline")
215
+ ```
216
+
217
+ Dadurch wird die Datei, in der Sie `PairClassificationPipeline` definiert haben, in den Ordner `"test-dynamic-pipeline"` kopiert,
218
+ und speichert das Modell und den Tokenizer der Pipeline, bevor Sie alles in das Repository verschieben
219
+ `{Ihr_Benutzername}/test-dynamic-pipeline`. Danach kann jeder die Pipeline verwenden, solange er die Option
220
+ `trust_remote_code=True` angeben:
221
+
222
+ ```py
223
+ from transformers import pipeline
224
+
225
+ classifier = pipeline(model="{your_username}/test-dynamic-pipeline", trust_remote_code=True)
226
+ ```
227
+
228
+ ## Hinzufügen der Pipeline zu 🤗 Transformers
229
+
230
+ Wenn Sie Ihre Pipeline zu 🤗 Transformers beitragen möchten, müssen Sie ein neues Modul im Untermodul `pipelines` hinzufügen
231
+ mit dem Code Ihrer Pipeline hinzufügen. Fügen Sie es dann der Liste der in `pipelines/__init__.py` definierten Aufgaben hinzu.
232
+
233
+ Dann müssen Sie noch Tests hinzufügen. Erstellen Sie eine neue Datei `tests/test_pipelines_MY_PIPELINE.py` mit Beispielen für die anderen Tests.
234
+
235
+ Die Funktion `run_pipeline_test` ist sehr allgemein gehalten und läuft auf kleinen Zufallsmodellen auf jeder möglichen
236
+ Architektur, wie durch `model_mapping` und `tf_model_mapping` definiert.
237
+
238
+ Dies ist sehr wichtig, um die zukünftige Kompatibilität zu testen, d.h. wenn jemand ein neues Modell für
239
+ `XXXForQuestionAnswering` hinzufügt, wird der Pipeline-Test versuchen, mit diesem Modell zu arbeiten. Da die Modelle zufällig sind, ist es
240
+ ist es unmöglich, die tatsächlichen Werte zu überprüfen. Deshalb gibt es eine Hilfsfunktion `ANY`, die einfach versucht, die
241
+ Ausgabe der Pipeline TYPE.
242
+
243
+ Außerdem *müssen* Sie 2 (idealerweise 4) Tests implementieren.
244
+
245
+ - `test_small_model_pt` : Definieren Sie 1 kleines Modell für diese Pipeline (es spielt keine Rolle, ob die Ergebnisse keinen Sinn ergeben)
246
+ und testen Sie die Ausgaben der Pipeline. Die Ergebnisse sollten die gleichen sein wie bei `test_small_model_tf`.
247
+ - `test_small_model_tf` : Definieren Sie 1 kleines Modell für diese Pipeline (es spielt keine Rolle, ob die Ergebnisse keinen Sinn ergeben)
248
+ und testen Sie die Ausgaben der Pipeline. Die Ergebnisse sollten die gleichen sein wie bei `test_small_model_pt`.
249
+ - `test_large_model_pt` (`optional`): Testet die Pipeline an einer echten Pipeline, bei der die Ergebnisse
250
+ Sinn machen. Diese Tests sind langsam und sollten als solche gekennzeichnet werden. Hier geht es darum, die Pipeline zu präsentieren und sicherzustellen
251
+ sicherzustellen, dass es in zukünftigen Versionen keine Abweichungen gibt.
252
+ - `test_large_model_tf` (`optional`): Testet die Pipeline an einer echten Pipeline, bei der die Ergebnisse
253
+ Sinn machen. Diese Tests sind langsam und sollten als solche gekennzeichnet werden. Hier geht es darum, die Pipeline zu präsentieren und sicherzustellen
254
+ sicherzustellen, dass es in zukünftigen Versionen keine Abweichungen gibt.
docs/source/de/autoclass_tutorial.md ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Vortrainierte Instanzen mit einer AutoClass laden
18
+
19
+ Bei so vielen verschiedenen Transformator-Architekturen kann es eine Herausforderung sein, eine für Ihren Checkpoint zu erstellen. Als Teil der 🤗 Transformers Kernphilosophie, die Bibliothek leicht, einfach und flexibel nutzbar zu machen, leitet eine `AutoClass` automatisch die richtige Architektur aus einem gegebenen Checkpoint ab und lädt sie. Mit der Methode `from_pretrained()` kann man schnell ein vortrainiertes Modell für eine beliebige Architektur laden, so dass man keine Zeit und Ressourcen aufwenden muss, um ein Modell von Grund auf zu trainieren. Die Erstellung dieser Art von Checkpoint-agnostischem Code bedeutet, dass Ihr Code, wenn er für einen Checkpoint funktioniert, auch mit einem anderen Checkpoint funktionieren wird - solange er für eine ähnliche Aufgabe trainiert wurde - selbst wenn die Architektur unterschiedlich ist.
20
+
21
+ <Tip>
22
+
23
+ Denken Sie daran, dass sich die Architektur auf das Skelett des Modells bezieht und die Checkpoints die Gewichte für eine bestimmte Architektur sind. Zum Beispiel ist [BERT](https://huggingface.co/google-bert/bert-base-uncased) eine Architektur, während `google-bert/bert-base-uncased` ein Checkpoint ist. Modell ist ein allgemeiner Begriff, der entweder Architektur oder Prüfpunkt bedeuten kann.
24
+
25
+ </Tip>
26
+
27
+ In dieser Anleitung lernen Sie, wie man:
28
+
29
+ * Einen vortrainierten Tokenizer lädt.
30
+ * Einen vortrainierten Merkmalsextraktor lädt.
31
+ * Einen vortrainierten Prozessor lädt.
32
+ * Ein vortrainiertes Modell lädt.
33
+
34
+ ## AutoTokenizer
35
+
36
+ Nahezu jede NLP-Aufgabe beginnt mit einem Tokenizer. Ein Tokenizer wandelt Ihre Eingabe in ein Format um, das vom Modell verarbeitet werden kann.
37
+
38
+ Laden Sie einen Tokenizer mit [`AutoTokenizer.from_pretrained`]:
39
+
40
+ ```py
41
+ >>> from transformers import AutoTokenizer
42
+
43
+ >>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
44
+ ```
45
+
46
+ Dann tokenisieren Sie Ihre Eingabe wie unten gezeigt:
47
+
48
+ ```py
49
+ >>> sequence = "In a hole in the ground there lived a hobbit."
50
+ >>> print(tokenizer(sequence))
51
+ {'input_ids': [101, 1999, 1037, 4920, 1999, 1996, 2598, 2045, 2973, 1037, 7570, 10322, 4183, 1012, 102],
52
+ 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
53
+ 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
54
+ ```
55
+
56
+ ## AutoFeatureExtractor
57
+
58
+ Für Audio- und Bildverarbeitungsaufgaben verarbeitet ein Merkmalsextraktor das Audiosignal oder Bild in das richtige Eingabeformat.
59
+
60
+ Laden Sie einen Merkmalsextraktor mit [`AutoFeatureExtractor.from_pretrained`]:
61
+
62
+ ```py
63
+ >>> from transformers import AutoFeatureExtractor
64
+
65
+ >>> feature_extractor = AutoFeatureExtractor.from_pretrained(
66
+ ... "ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition"
67
+ ... )
68
+ ```
69
+
70
+ ## AutoProcessor
71
+
72
+ Multimodale Aufgaben erfordern einen Prozessor, der zwei Arten von Vorverarbeitungswerkzeugen kombiniert. Das Modell [LayoutLMV2](model_doc/layoutlmv2) beispielsweise benötigt einen Feature-Extraktor für Bilder und einen Tokenizer für Text; ein Prozessor kombiniert beide.
73
+
74
+ Laden Sie einen Prozessor mit [`AutoProcessor.from_pretrained`]:
75
+
76
+ ```py
77
+ >>> from transformers import AutoProcessor
78
+
79
+ >>> processor = AutoProcessor.from_pretrained("microsoft/layoutlmv2-base-uncased")
80
+ ```
81
+
82
+ ## AutoModel
83
+
84
+ <frameworkcontent>
85
+ <pt>
86
+ Mit den `AutoModelFor`-Klassen können Sie schließlich ein vortrainiertes Modell für eine bestimmte Aufgabe laden (siehe [hier](model_doc/auto) für eine vollständige Liste der verfügbaren Aufgaben). Laden Sie zum Beispiel ein Modell für die Sequenzklassifikation mit [`AutoModelForSequenceClassification.from_pretrained`]:
87
+
88
+ ```py
89
+ >>> from transformers import AutoModelForSequenceClassification
90
+
91
+ >>> model = AutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
92
+ ```
93
+
94
+ Sie können denselben Prüfpunkt problemlos wiederverwenden, um eine Architektur für eine andere Aufgabe zu laden:
95
+
96
+ ```py
97
+ >>> from transformers import AutoModelForTokenClassification
98
+
99
+ >>> model = AutoModelForTokenClassification.from_pretrained("distilbert/distilbert-base-uncased")
100
+ ```
101
+
102
+ <Tip warning={true}>
103
+
104
+ Für PyTorch-Modelle verwendet die Methode `from_pretrained()` `torch.load()`, die intern `pickle` verwendet und als unsicher bekannt ist. Generell sollte man niemals ein Modell laden, das aus einer nicht vertrauenswürdigen Quelle stammen könnte, oder das manipuliert worden sein könnte. Dieses Sicherheitsrisiko wird für öffentliche Modelle, die auf dem Hugging Face Hub gehostet werden, teilweise gemildert, da diese bei jeder Übertragung [auf Malware](https://huggingface.co/docs/hub/security-malware) gescannt werden. Siehe die [Hub-Dokumentation](https://huggingface.co/docs/hub/security) für Best Practices wie [signierte Commit-Verifizierung](https://huggingface.co/docs/hub/security-gpg#signing-commits-with-gpg) mit GPG.
105
+
106
+ TensorFlow- und Flax-Checkpoints sind nicht betroffen und können in PyTorch-Architekturen mit den Kwargs `from_tf` und `from_flax` für die Methode `from_pretrained` geladen werden, um dieses Problem zu umgehen.
107
+
108
+ </Tip>
109
+
110
+ Im Allgemeinen empfehlen wir die Verwendung der Klasse "AutoTokenizer" und der Klasse "AutoModelFor", um trainierte Instanzen von Modellen zu laden. Dadurch wird sichergestellt, dass Sie jedes Mal die richtige Architektur laden. Im nächsten [Tutorial] (Vorverarbeitung) erfahren Sie, wie Sie Ihren neu geladenen Tokenizer, Feature Extractor und Prozessor verwenden, um einen Datensatz für die Feinabstimmung vorzuverarbeiten.
111
+ </pt>
112
+ <tf>
113
+ Mit den Klassen `TFAutoModelFor` schließlich können Sie ein vortrainiertes Modell für eine bestimmte Aufgabe laden (siehe [hier](model_doc/auto) für eine vollständige Liste der verfügbaren Aufgaben). Laden Sie zum Beispiel ein Modell für die Sequenzklassifikation mit [`TFAutoModelForSequenceClassification.from_pretrained`]:
114
+
115
+ ```py
116
+ >>> from transformers import TFAutoModelForSequenceClassification
117
+
118
+ >>> model = TFAutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
119
+ ```
120
+
121
+ Sie können denselben Prüfpunkt problemlos wiederverwenden, um eine Architektur für eine andere Aufgabe zu laden:
122
+
123
+ ```py
124
+ >>> from transformers import TFAutoModelForTokenClassification
125
+
126
+ >>> model = TFAutoModelForTokenClassification.from_pretrained("distilbert/distilbert-base-uncased")
127
+ ```
128
+
129
+ Im Allgemeinen empfehlen wir, die Klasse "AutoTokenizer" und die Klasse "TFAutoModelFor" zu verwenden, um vortrainierte Instanzen von Modellen zu laden. Dadurch wird sichergestellt, dass Sie jedes Mal die richtige Architektur laden. Im nächsten [Tutorial] (Vorverarbeitung) erfahren Sie, wie Sie Ihren neu geladenen Tokenizer, Feature Extractor und Prozessor verwenden, um einen Datensatz für die Feinabstimmung vorzuverarbeiten.
130
+ </tf>
131
+ </frameworkcontent>
docs/source/de/contributing.md ADDED
@@ -0,0 +1,334 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2024 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ -->
16
+
17
+ # Zu 🤗 Transformers beitragen
18
+
19
+ Jeder ist willkommen, einen Beitrag zu leisten, und wir schätzen den Beitrag jedes Einzelnen. Codebeiträge sind nicht der einzige Weg, der Community zu helfen. Fragen zu beantworten, anderen zu helfen und die Dokumentation zu verbessern, sind ebenfalls äußerst wertvoll.
20
+
21
+ Es hilft uns auch, wenn Sie das Projekt weiterempfehlen! Erwähnen Sie die Bibliothek in Blogposts über die großartigen Projekte, die sie ermöglicht hat, tweeten Sie, wenn sie Ihnen geholfen hat, oder hinterlassen Sie dem Repository ein ⭐️, um Danke zu sagen.
22
+
23
+ Wie auch immer Sie sich entscheiden beizutragen, seien Sie achtsam und respektieren Sie unseren [Verhaltenskodex](https://github.com/huggingface/transformers/blob/main/CODE_OF_CONDUCT.md).
24
+
25
+ **Dieser Leitfaden wurde stark durch den fantastischen [scikit-learn-Leitfaden für Beiträge](https://github.com/scikit-learn/scikit-learn/blob/main/CONTRIBUTING.md) inspiriert.**
26
+
27
+ ## Beitragsmöglichkeiten
28
+
29
+ Es gibt mehrere Wege, wie Sie zu 🤗 Transformers beitragen können:
30
+
31
+ * Beheben Sie bestehende Probleme im vorhandenen Code.
32
+ * Erstellen Sie Issues im Zusammenhang mit Fehlern oder gewünschten neuen Funktionen.
33
+ * Implementieren Sie neue Modelle.
34
+ * Tragen Sie zu den Beispielen oder zur Dokumentation bei.
35
+
36
+ Wenn Sie nicht wissen, wo Sie anfangen sollen, gibt es eine spezielle Liste von [Good First Issues](https://github.com/huggingface/transformers/contribute). Sie bietet Ihnen eine Liste offener und anfängerfreundlicher Probleme und hilft Ihnen, einen ersten Beitrag zu Open-Source zu leisten. Idealerweise erstellen Sie eine Pull-Anfrage und verlinken sie mit dem Issue, an dem Sie arbeiten möchten. Wir versuchen, erstellte PRs bevorzugt zu behandeln, da wir so den Fortschritt leicht verfolgen können, und die Option besteht, dass jemand anderes den PR übernehmen kann, falls der Beitragende keine Zeit mehr hat.
37
+
38
+ Für etwas mehr Herausforderung, können Sie auch einen Blick auf die Liste der [Good Second Issues](https://github.com/huggingface/transformers/labels/Good%20Second%20Issue) werfen. Generell gilt: Legen Sie los, wenn Sie sich den Anforderungen gewachsen sehen und wir helfen Ihnen dabei! 🚀
39
+
40
+ > Alle Beiträge sind für die Community gleichermaßen wertvoll. 🥰
41
+
42
+ ## Bestehende Probleme beheben
43
+
44
+ Wenn Ihnen ein Problem im vorhandenen Code auffällt und Sie eine Lösung im Sinn haben, können Sie gerne einen Beitrag leisten und [eine Pull-Anfrage erstellen](#eine-pull-anfrage-erstellen)!
45
+
46
+ ## Ein fehlerspezifisches Issue oder eine Feature-Anfrage erstellen
47
+
48
+ Tun Sie Ihr Bestes, diesen Richtlinien zu folgen, wenn Sie ein fehlerspezifisches Issue erstellen oder eine Feature-Anfrage einreichen. Das macht es uns leichter, Ihnen schnell und mit gutem Feedback zu antworten.
49
+
50
+ ### Haben Sie einen Fehler gefunden?
51
+
52
+ Die 🤗 Transformers-Bibliothek verdankt ihre Robustheit und Zuverlässigkeit aller Nutzer, die frisch entdeckte Probleme melden.
53
+
54
+ Wir würden es wirklich schätzen, wenn Sie **sicherstellen könnten, dass der Fehler noch nicht gemeldet wurde** (verwenden Sie die Suchleiste auf GitHub unter Issues), bevor Sie ein Issue erstellen. Ihr Problem sollte sich auch auf Fehler in der Bibliothek selbst und nicht auf Ihren eigenen Code beziehen. Wenn Sie sich nicht sicher sind, ob der Fehler in Ihrem eigenen Code oder der Bibliothek liegt, fragen Sie bitte zuerst im [Forum](https://discuss.huggingface.co/) nach. Das hilft uns, schneller auf Probleme im Zusammenhang mit der Bibliothek zu reagieren, anstatt auf allgemeine Fragen.
55
+
56
+ Wenn Sie sich vergewissert haben, dass der Fehler noch nicht gemeldet wurde, geben Sie bitte die folgenden Informationen in Ihrem Issue an, damit wir es schnell beheben können:
57
+
58
+ * Ihr **Betriebssystem und Version** sowie die Versionen von **Python**, **PyTorch** und **TensorFlow**, falls zutreffend.
59
+ * Ein kurzes und unabhängiges Code-Snippet, das es uns ermöglicht, den Fehler in weniger als 30 Sekunden nachzustellen.
60
+ * Den *vollständigen* Traceback, wenn eine Ausnahme geworfen wird.
61
+ * Fügen Sie weitere hilfreiche Informationen, wie z. B. Screenshots, an.
62
+
63
+ Um das Betriebssystem und die Softwareversionen automatisch auszugeben, führen Sie den folgenden Befehl aus:
64
+
65
+ ```bash
66
+ transformers-cli env
67
+ ```
68
+
69
+ Sie können denselben Befehl auch im Hauptverzeichnis des Repositorys ausführen:
70
+
71
+ ```bash
72
+ python src/transformers/commands/transformers_cli.py env
73
+ ```
74
+
75
+ ### Möchten Sie eine neue Funktion?
76
+
77
+ Wenn Sie eine bestimmte neue Funktion in 🤗 Transformers sehen möchten, erstellen Sie bitte ein Issue und fügen Sie eine Beschreibung hinzu:
78
+
79
+ 1. Was ist die *Motivation* hinter dieser Funktion? Steht sie in Zusammenhang mit einem Problem oder einer Frustration mit der Bibliothek? Ist es eine Funktion, die Sie für ein Projekt benötigen? Ist es etwas, an dem Sie gearbeitet haben und denken, dass es der Community nutzen könnte?
80
+
81
+ Was auch immer es ist, wir würden uns freuen, davon zu hören!
82
+
83
+ 1. Beschreiben Sie Ihre gewünschte Funktion so detailliert wie möglich. Je mehr Sie uns darüber erzählen können, desto besser können wir Ihnen helfen.
84
+ 1. Stellen Sie einen *Code-Schnipsel* bereit, der die Funktionsweise demonstriert.
85
+ 1. Falls die Funktion auf einem Paper beruht, verlinken Sie dieses bitte.
86
+
87
+ Wenn Ihr Issue gut geschrieben ist, sind wir zum Zeitpunkt seiner Erstellung bereits zu 80 % fertig.
88
+
89
+ Wir haben [Vorlagen](https://github.com/huggingface/transformers/tree/main/templates) hinzugefügt, um Ihnen den Start Ihres Issues zu erleichtern.
90
+
91
+ ## Möchten Sie ein neues Modell implementieren?
92
+
93
+ Es werden ständig neue Modelle veröffentlicht. Wenn Sie ein neues Modell implementieren möchten, geben Sie bitte folgende Informationen an:
94
+
95
+ * Eine kurze Beschreibung des Modells und einen Link zum Paper.
96
+ * Link zur Implementierung, falls sie Open-Source ist.
97
+ * Link zu den Modellgewichten, falls verfügbar.
98
+
99
+ Lassen Sie es uns wissen, wenn Sie bereit sind, das Modell selbst beizutragen. Dann können wir Ihnen helfen, es zu 🤗 Transformers hinzuzufügen!
100
+
101
+ Wir haben auch einen technischen Leitfaden dazu, [wie man ein Modell zu 🤗 Transformers hinzufügt](https://huggingface.co/docs/transformers/add_new_model).
102
+
103
+ ## Möchten Sie die Dokumentation erweitern?
104
+
105
+ Wir sind immer auf der Suche nach Verbesserungen, die die Dokumentation klarer und präziser machen. Bitte teilen Sie uns Verbesserungsvorschläge mit, wie z. B. Tippfehler und fehlende, unklare oder ungenaue Inhalte. Wir übernehmen gerne die Änderungen oder helfen Ihnen, einen Beitrag zu leisten, wenn Sie daran interessiert sind!
106
+
107
+ Für weitere Einzelheiten darüber, wie man die Dokumentation generiert, erstellt und schreibt, werfen Sie einen Blick auf das [README](https://github.com/huggingface/transformers/tree/main/docs) der Dokumentation.
108
+
109
+ ## Eine Pull-Anfrage erstellen
110
+
111
+ Bevor Sie irgendwelchen Code schreiben, empfehlen wir Ihnen dringend, die bestehenden PRs oder Issues zu durchsuchen, um sicherzustellen, dass niemand bereits an diesem Thema arbeitet. Wenn Sie sich unsicher sind, ist es immer eine gute Idee, nach Feedback in einem neuen Issue zu fragen.
112
+
113
+ Sie benötigen grundlegende `git`-Kenntnisse, um zu 🤗 Transformers beizutragen. Obwohl `git` nicht das einfachste Werkzeug ist, hat es ein sehr gutes Handbuch. Geben Sie `git --help` in eine Shell ein und genießen Sie es! Wenn Sie Bücher bevorzugen, ist [Pro Git](https://git-scm.com/book/en/v2) eine gute Anlaufstelle.
114
+
115
+ Sie benötigen **[Python 3.8](https://github.com/huggingface/transformers/blob/main/setup.py#L426)** oder höher, um zu 🤗 Transformers beizutragen. Folgen Sie den nachstehenden Schritten, um mit dem Beitrag zu beginnen:
116
+
117
+ 1. Forken Sie das [Repository](https://github.com/huggingface/transformers), indem Sie auf den **[Fork](https://github.com/huggingface/transformers/fork)**-Button auf der Seite des Repositorys klicken. Dadurch wird eine Kopie des Codes auf Ihrem GitHub-Account erstellt.
118
+
119
+ 1. Klonen Sie Ihren Fork auf Ihre lokale Festplatte und fügen Sie das ursprüngliche Repository als Remote hinzu:
120
+
121
+ ```bash
122
+ git clone git@github.com:<your Github handle>/transformers.git
123
+ cd transformers
124
+ git remote add upstream https://github.com/huggingface/transformers.git
125
+ ```
126
+
127
+ 1. Erstellen Sie einen neuen Branch, um Ihre Änderungen zu speichern:
128
+
129
+ ```bash
130
+ git checkout -b a-descriptive-name-for-my-changes
131
+ ```
132
+
133
+ 🚨 Arbeiten Sie **nicht** auf dem `main` Branch!
134
+
135
+ 1. Richten Sie eine Entwicklungsumgebung ein, indem Sie den folgenden Befehl in einer virtuellen Umgebung ausführen:
136
+
137
+ ```bash
138
+ pip install -e ".[dev]"
139
+ ```
140
+
141
+ Wenn 🤗 Transformers bereits in der virtuellen Umgebung installiert war, entfernen Sie es mit `pip uninstall transformers`, bevor Sie es im bearbeitbaren Modus mit dem `-e` Flag neu installieren.
142
+
143
+ Abhängig von Ihrem Betriebssystem und durch die wachsende Anzahl der optionalen Abhängigkeiten von Transformers könnten Sie mit diesem Befehl einen Fehler verursachen. Wenn das der Fall ist, stellen Sie sicher, dass Sie ihr bevorzugtes Deep-Learning-Framework (PyTorch, TensorFlow und/oder Flax) installieren und anschließend den folgenden Befehl ausführen:
144
+
145
+ ```bash
146
+ pip install -e ".[quality]"
147
+ ```
148
+
149
+ Dies sollte für die meisten Anwendungsfälle ausreichend sein.
150
+
151
+ 1. Entwickeln Sie die Funktionen in Ihrem Branch.
152
+
153
+ Während Sie an Ihrem Code arbeiten, sollten Sie sicherstellen, dass die Test-Suite erfolgreich durchläuft. Führen Sie die von Ihren ��nderungen betroffenen Tests wie folgt aus:
154
+
155
+ ```bash
156
+ pytest tests/<TEST_TO_RUN>.py
157
+ ```
158
+
159
+ Weitere Informationen über Tests finden Sie in der Anleitung zum Thema [Testen](https://huggingface.co/docs/transformers/testing).
160
+
161
+ 🤗 Transformers stützt sich auf `black` und `ruff`, um seinen Quellcode konsistent zu formatieren. Nachdem Sie Änderungen vorgenommen haben, wenden Sie automatische Stilkorrekturen und Codeprüfungen, die nicht automatisiert werden können, in einem Schritt an:
162
+
163
+ ```bash
164
+ make fixup
165
+ ```
166
+
167
+ Dieser Task ist optimiert, nur mit Dateien zu arbeiten, die von Ihrer PR modifiziert wurden.
168
+
169
+ Wenn Sie die Prüfungen nacheinander ausführen möchten, wendet der folgende Befehl die Stilkorrekturen an:
170
+
171
+ ```bash
172
+ make style
173
+ ```
174
+
175
+ 🤗 Transformers verwendet auch `ruff` und einige benutzerdefinierte Skripte, um auf Programmierfehler zu prüfen. Qualitätskontrollen werden von der CI durchgeführt, aber Sie können die gleichen Überprüfungen auch selbst ausführen:
176
+
177
+ ```bash
178
+ make quality
179
+ ```
180
+
181
+ Abschließend haben wir viele Skripte, die sicherstellen, dass wir alle betroffenen Dateien aktualisieren, wenn wir ein neues Modell hinzufügen. Sie können diese wie folgt ausführen:
182
+
183
+ ```bash
184
+ make repo-consistency
185
+ ```
186
+
187
+ Um mehr über diese Prüfungen zu erfahren und wie man mit ihnen Probleme behebt, lesen Sie den Leitfaden zu [Überprüfungen bei einer Pull-Anfrage](https://huggingface.co/docs/transformers/pr_checks).
188
+
189
+ Wenn Sie Dokumente im Verzeichnis `docs/source` ändern, stellen Sie sicher, dass die Dokumentation noch generiert werden kann. Diese Prüfung wird auch im CI laufen, wenn Sie eine Pull-Anfrage erstellen. Um eine lokale Prüfung durchzuführen, müssen Sie den Dukumentation-Builder installieren:
190
+
191
+ ```bash
192
+ pip install ".[docs]"
193
+ ```
194
+
195
+ Führen Sie den folgenden Befehl im Hauptverzeichnis des Repositorys aus:
196
+
197
+ ```bash
198
+ doc-builder build transformers docs/source/en --build_dir ~/tmp/test-build
199
+ ```
200
+
201
+ Dadurch wird die Dokumentation im Ordner `~/tmp/test-build` erstellt, wo Sie die erzeugten Markdown-Dateien mit Ihrem bevorzugten Editor überprüfen können. Sie können auch eine Vorschau der Dokumentation auf GitHub sehen, wenn Sie eine Pull-Anfrage öffnen.
202
+
203
+ Wenn Sie mit Ihren Änderungen zufrieden sind, fügen Sie die geänderten Dateien mit `git add` hinzu und speichern Sie Ihre Änderungen lokal mit `git commit`:
204
+
205
+ ```bash
206
+ git add modified_file.py
207
+ git commit
208
+ ```
209
+
210
+ Bitte achten Sie darauf, [gute Commit-Nachrichten](https://chris.beams.io/posts/git-commit/) zu schreiben, um die von Ihnen vorgenommenen Änderungen klar zu kommunizieren!
211
+
212
+ Um Ihre Kopie des Codes auf dem aktuellen Stand des ursprünglichen Repositorys zu halten, rebasen Sie Ihren Branch auf `upstream/branch` *bevor* Sie eine Pull-Anfrage öffnen oder falls Sie von einem Maintainer dazu aufgefordert werden:
213
+
214
+ ```bash
215
+ git fetch upstream
216
+ git rebase upstream/main
217
+ ```
218
+
219
+ Pushen Sie Ihre Änderungen in Ihrem Branch:
220
+
221
+ ```bash
222
+ git push -u origin a-descriptive-name-for-my-changes
223
+ ```
224
+
225
+ Wenn Sie bereits eine Pull-Anfrage erstellt haben, müssen Sie den Push mit dem `--force` Flag erzwingen. Andernfalls, wenn die Pull-Anfrage noch nicht erstellt wurde, können Sie Ihre Änderungen normal pushen.
226
+
227
+ 1. Jetzt können Sie zu Ihrem Fork des Repositorys auf GitHub gehen und auf **Pull-Anfrage** klicken, um eine Pull-Anfrage zu erstellen. Stellen Sie sicher, dass Sie alle Punkte auf unserer [Checkliste](#checkliste-für-pull-anfragen) unten abhaken. Wenn Sie fertig sind, können Sie Ihre Änderungen zur Überprüfung an die Projektverantwortlichen senden.
228
+
229
+ 1. Es ist kein Problem, wenn die Maintainer Änderungen beantragen, das geschieht auch bei unseren Kernmitarbeitern! Damit jeder die Änderungen in der Pull-Anfrage sehen kann, arbeiten Sie in Ihrem lokalen Branch und pushen die Änderungen zu Ihrem Fork. Sie werden automatisch in der Pull-Anfrage erscheinen.
230
+
231
+ ### Checkliste für Pull-Anfragen
232
+
233
+ ☐ Der Titel der Pull-Anfrage sollte Ihren Beitrag zusammenfassen.<br>
234
+ ☐ Wenn Ihre Pull-Anfrage ein bestimmtes Issue bearbeitet, erwähnen Sie bitte die zugehörige Nummer in der Beschreibung der Pull-Anfrage, sodass diese verlinkt sind (und Personen, die das Issue lesen, wissen, dass Sie daran arbeiten).<br>
235
+ ☐ Um eine fortlaufende Bearbeitung anzuzeigen, versehen Sie bitte den Titel mit einem `[WIP]` Präfix. Diese sind nützlich, um doppelte Arbeit zu verhindern und sie von PRs abzuheben, die bereit zum Zusammenführen sind.<br>
236
+ ☐ Stellen Sie sicher, dass existierende Tests bestanden werden.<br>
237
+ ☐ Wenn Sie eine neue Funktion hinzufügen, erstellen Sie auch Tests dafür.<br>
238
+
239
+ * Wenn Sie ein neues Modell hinzufügen, stellen Sie sicher, dass Sie `ModelTester.all_model_classes = (MyModel, MyModelWithLMHead,...)` verwenden, um die gemeinsamen Tests auszulösen.
240
+ * Wenn Sie neue `@slow` Tests hinzufügen, stellen Sie mit `RUN_SLOW=1 python -m pytest tests/models/my_new_model/test_my_new_model.py` sicher, dass diese erfolgreich durchlaufen.
241
+ * Wenn Sie einen neuen Tokenizer hinzufügen, schreiben Sie Tests und stellen Sie mit `RUN_SLOW=1 python -m pytest tests/models/{your_model_name}/test_tokenization_{your_model_name}.py` sicher, dass diese erfolgreich durchlaufen.
242
+ * CircleCI führt die langsamen Tests nicht aus, aber GitHub Actions tut dies jede Nacht!<br>
243
+
244
+ ☐ Alle public Methoden müssen informative Docstrings haben (siehe [`modeling_bert.py`](https://github.com/huggingface/transformers/blob/main/src/transformers/models/bert/modeling_bert.py) als Beispiel).<br>
245
+ ☐ Aufgrund des schnell wachsenden Repositorys fügen Sie bitte keine Bilder, Videos oder andere Nicht-Textdateien hinzu, die das Repository erheblich belasten würden. Verwenden Sie stattdessen ein Hub-Repository wie [`hf-internal-testing`](https://huggingface.co/hf-internal-testing), um diese Dateien zu hosten und sie per URL zu verlinken. Wir empfehlen Bilder, die zur Dokumentation gehören, im folgenden Repository abzulegen: [huggingface/documentation-images](https://huggingface.co/datasets/huggingface/documentation-images). Sie können eine PR in diesem Datasets-Repository erstellen und ein Hugging-Face-Mitglied bitten, sie zu mergen.
246
+
247
+ Um mehr über die Prüfungen zu erfahren, die bei einer Pull-Anfrage ausgelöst werden, lesen Sie unseren Leitfaden zu [Überprüfungen bei einer Pull-Anfrage](https://huggingface.co/docs/transformers/pr_checks).
248
+
249
+ ### Tests
250
+
251
+ Eine umfangreiche Test-Suite ist enthalten, um das Verhalten der Bibliothek und mehrerer Beispiele zu testen. Tests für die Bibliothek und Beispiele finden Sie jeweils im [tests](https://github.com/huggingface/transformers/tree/main/tests) und im [examples](https://github.com/huggingface/transformers/tree/main/examples) Ordner.
252
+
253
+ Wir bevorzugen `pytest` und `pytest-xdist`, weil es schneller ist. Geben Sie einen *Pfad zu einem Unterordner oder einer Testdatei* vom Hauptverzeichnis des Repositorys aus an, um den Test auszuführen:
254
+
255
+ ```bash
256
+ python -m pytest -n auto --dist=loadfile -s -v ./tests/models/my_new_model
257
+ ```
258
+
259
+ Analog für den `examples` Ordner, geben Sie einen *Pfad zu einem Unterordner oder einer Testdatei* an, um den Test auszuführen. Z. B. führt der folgende Befehl den Test des Unterordners für Textklassifizierung im PyTorch `examples` Ordner durch:
260
+
261
+ ```bash
262
+ pip install -r examples/xxx/requirements.txt # nur beim ersten Mal erforderlich
263
+ python -m pytest -n auto --dist=loadfile -s -v ./examples/pytorch/text-classification
264
+ ```
265
+
266
+ Tatsächlich ist dies genau, wie unsere `make test` und `make test-examples` Befehle implementiert sind (abgesehen von `pip install`)!
267
+
268
+ Sie können auch eine kleinere Anzahl an Tests angeben, um nur die Funktion, an der Sie arbeiten, zu testen.
269
+
270
+ Standardmäßig werden langsame Tests übersprungen, aber Sie können die Umgebungsvariable `RUN_SLOW` auf `yes` setzen, um sie auszuführen. Dies wird den Download vieler Gigabyte an Modellen starten - stellen Sie also sicher, dass Sie sowohl genügend Festplattenspeicher als auch eine gute Internetverbindung oder die nötige Geduld haben!
271
+
272
+ <Tip warning={true}>
273
+
274
+ Vergessen Sie nicht, einen *Pfad zu einem Unterordner oder einer Testdatei* anzugeben, um den Test auszuführen. Sonst führen Sie alle Tests im `tests` oder `examples` Ordner aus, was sehr lange dauern wird!
275
+
276
+ </Tip>
277
+
278
+ ```bash
279
+ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./tests/models/my_new_model
280
+ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./examples/pytorch/text-classification
281
+ ```
282
+
283
+ Wie bei den langsamen Tests gibt es auch andere Umgebungsvariablen, die standardmäßig beim Testen nicht gesetzt sind:
284
+
285
+ * `RUN_CUSTOM_TOKENIZERS`: Aktiviert Tests für benutzerdefinierte Tokenizer.
286
+ * `RUN_PT_FLAX_CROSS_TESTS`: Aktiviert Tests für die Integration von PyTorch + Flax.
287
+ * `RUN_PT_TF_CROSS_TESTS`: Aktiviert Tests für die Integration von TensorFlow + PyTorch.
288
+
289
+ Weitere Umgebungsvariablen und zusätzliche Informationen finden Sie in der [testing_utils.py](src/transformers/testing_utils.py).
290
+
291
+ 🤗 Transformers verwendet `pytest` nur als Test-Runner. Es verwendet keine `pytest`-spezifischen Funktionen in der Test-Suite selbst.
292
+
293
+ Das bedeutet, `unittest` wird vollständig unterstützt. Folgend wird beschrieben, wie man Tests mit `unittest` ausführt:
294
+
295
+ ```bash
296
+ python -m unittest discover -s tests -t . -v
297
+ python -m unittest discover -s examples -t examples -v
298
+ ```
299
+
300
+ ### Stil-Leitfaden
301
+
302
+ Für Docstrings befolgt 🤗 Transformers den [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html).
303
+ Lesen Sie unseren [Leitfaden zum Schreiben von Dokumentationen](https://github.com/huggingface/transformers/tree/main/docs#writing-documentation---specification) für weitere Informationen.
304
+
305
+ ### Entwickeln unter Windows
306
+
307
+ Unter Windows (falls Sie nicht im [Windows-Subsystem für Linux](https://learn.microsoft.com/en-us/windows/wsl/) oder WSL arbeiten) müssen Sie git so konfigurieren, dass Windows `CRLF` in Linux `LF` Zeilenenden umgewandelt werden:
308
+
309
+ ```bash
310
+ git config core.autocrlf input
311
+ ```
312
+
313
+ Eine Möglichkeit, den `make`-Befehl unter Windows auszuführen, ist mit MSYS2:
314
+
315
+ 1. Laden Sie [MSYS2](https://www.msys2.org/) herunter und installieren Sie es nach `C:\msys64`.
316
+ 1. Öffnen Sie die Kommandozeile `C:\msys64\msys2.exe` (sie sollte vom **Start**-Menü aus verfügbar sein).
317
+ 1. Führen Sie den Befehl in der Shell aus: `pacman -Syu` und installieren Sie `make` mit `pacman -S make`.
318
+ 1. Fügen Sie `C:\msys64\usr\bin` an Ihrer PATH-Umgebungsvariable an.
319
+
320
+ Sie können nun `make` aus jedem Terminal heraus verwenden (PowerShell, cmd.exe usw.)! 🎉
321
+
322
+ ### Ein geforktes Repository mit dem Haupt-Repository von Hugging Face synchronisieren
323
+
324
+ Beim Aktualisieren des main-Branches eines geforkten Repositories beachten Sie bitte die folgenden Schritte, um das Anpingen des Haupt-Repositorys zu vermeiden, was unnötige Verweise in abhängigen PRs vermerkt und beteiligte Entwickler benachrichtigt:
325
+
326
+ 1. Wenn möglich, vermeiden Sie die Synchronisation mit dem Haupt-Repository über einen Branch und PR im geforkten Repository. Mergen Sie stattdessen direkt in den main-Branch des Forks.
327
+ 1. Wenn ein PR unbedingt notwendig ist, verwenden Sie die folgenden Schritte, nachdem Sie Ihren Branch ausgecheckt haben:
328
+
329
+ ```bash
330
+ git checkout -b your-branch-for-syncing
331
+ git pull --squash --no-commit upstream main
332
+ git commit -m '<your message without GitHub references>'
333
+ git push --set-upstream origin your-branch-for-syncing
334
+ ```
docs/source/de/index.md ADDED
@@ -0,0 +1,334 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # 🤗 Transformers
18
+
19
+ Maschinelles Lernen auf dem neuesten Stand der Technik für PyTorch, TensorFlow und JAX.
20
+
21
+ 🤗 Transformers bietet APIs zum einfachen Herunterladen und Trainieren von vortrainierten Modellen auf dem neuesten Stand der Technik. Die Verwendung von vortrainierten Modellen kann Rechenkosten sparen und den CO2-Fußabdruck reduzieren und Zeit sparen, die für das Training eines Modells von Grund auf benötigt wird. Die Modelle können für verschiedene Modalitäten verwendet werden, wie z. B.:
22
+
23
+ * 📝 Text: Textklassifizierung, Informationsextrahierung, Beantwortung von Fragen, Zusammenfassung, Übersetzung und Texterstellung in über 100 Sprachen.
24
+ * 🖼️ Bilder: Bildklassifizierung, Objekterkennung und Segmentierung.
25
+ * 🗣️ Audio: Spracherkennung und Audioklassifizierung.
26
+ * 🐙 Multimodal: Beantwortung von Tabellenfragen, optische Zeichenerkennung, Informationsextraktion aus gescannten Dokumenten, Videoklassifizierung und Beantwortung visueller Fragen.
27
+
28
+ Unsere Bibliothek unterstützt die nahtlose Integration von drei der beliebtesten Deep-Learning-Bibliotheken: [PyTorch](https://pytorch.org/), [TensorFlow](https://www.tensorflow.org/) und [JAX](https://jax.readthedocs.io/en/latest/). Trainieren Sie Ihr Modell in drei Codezeilen in einem Framework und laden Sie es zur Inferenz mit einem anderen.
29
+
30
+ Jede 🤗 Transformers-Architektur ist in einem eigenständigen Python-Modul definiert, so dass sie leicht für Forschung und Experimente angepasst werden kann.
31
+
32
+ ## Wenn Sie auf der Suche nach individueller Unterstützung durch das Hugging Face-Team sind
33
+
34
+ <a target="_blank" href="https://huggingface.co/support">
35
+ <img alt="HuggingFace Expert Acceleration Program" src="https://cdn-media.huggingface.co/marketing/transformers/new-support-improved.png" style="width: 100%; max-width: 600px; border: 1px solid #eee; border-radius: 4px; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);">
36
+ </a>
37
+
38
+ ## Inhalt
39
+
40
+ Die Dokumentation ist in fünf Teile gegliedert:
41
+
42
+ - **GET STARTED** enthält eine kurze Tour und Installationsanweisungen, um mit 🤗 Transformers loszulegen.
43
+ - **TUTORIALS** sind ein hervorragender Ausgangspunkt, wenn Sie neu in unserer Bibliothek sind. Dieser Abschnitt hilft Ihnen, die grundlegenden Fähigkeiten zu erlangen, die Sie benötigen, um mit 🤗 Transformers zu arbeiten.
44
+ - **HOW-TO GUIDES** zeigen Ihnen, wie Sie ein bestimmtes Ziel erreichen können, z. B. die Feinabstimmung eines vortrainierten Modells für die Sprachmodellierung oder die Erstellung eines benutzerdefinierten Modellkopfs.
45
+ - **KONZEPTUELLE ANLEITUNGEN** bietet weitere Diskussionen und Erklärungen zu den zugrunde liegenden Konzepten und Ideen hinter Modellen, Aufgaben und der Designphilosophie von 🤗 Transformers.
46
+ - **API** beschreibt jede Klasse und Funktion, gruppiert in:
47
+
48
+ - **MAIN CLASSES** für die Hauptklassen, die die wichtigsten APIs der Bibliothek darstellen.
49
+ - MODELLE** für die Klassen und Funktionen, die zu jedem in der Bibliothek implementierten Modell gehören.
50
+ - **INTERNAL HELPERS** für die Klassen und Funktionen, die wir intern verwenden.
51
+
52
+ Die Bibliothek enthält derzeit JAX-, PyTorch- und TensorFlow-Implementierungen, vortrainierte Modellgewichte, Nutzungsskripte und Konvertierungsprogramme für die folgenden Modelle.
53
+
54
+ ### Unterstütze Modelle
55
+
56
+ <!--This list is updated automatically from the README with _make fix-copies_. Do not update manually! -->
57
+
58
+ 1. **[ALBERT](model_doc/albert)** (from Google Research and the Toyota Technological Institute at Chicago) released with the paper [ALBERT: A Lite BERT for Self-supervised Learning of Language Representations](https://arxiv.org/abs/1909.11942), by Zhenzhong Lan, Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush Sharma, Radu Soricut.
59
+ 1. **[ALIGN](model_doc/align)** (from Google Research) released with the paper [Scaling Up Visual and Vision-Language Representation Learning With Noisy Text Supervision](https://arxiv.org/abs/2102.05918) by Chao Jia, Yinfei Yang, Ye Xia, Yi-Ting Chen, Zarana Parekh, Hieu Pham, Quoc V. Le, Yunhsuan Sung, Zhen Li, Tom Duerig.
60
+ 1. **[BART](model_doc/bart)** (from Facebook) released with the paper [BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension](https://arxiv.org/abs/1910.13461) by Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Ves Stoyanov and Luke Zettlemoyer.
61
+ 1. **[BARThez](model_doc/barthez)** (from École polytechnique) released with the paper [BARThez: a Skilled Pretrained French Sequence-to-Sequence Model](https://arxiv.org/abs/2010.12321) by Moussa Kamal Eddine, Antoine J.-P. Tixier, Michalis Vazirgiannis.
62
+ 1. **[BARTpho](model_doc/bartpho)** (from VinAI Research) released with the paper [BARTpho: Pre-trained Sequence-to-Sequence Models for Vietnamese](https://arxiv.org/abs/2109.09701) by Nguyen Luong Tran, Duong Minh Le and Dat Quoc Nguyen.
63
+ 1. **[BEiT](model_doc/beit)** (from Microsoft) released with the paper [BEiT: BERT Pre-Training of Image Transformers](https://arxiv.org/abs/2106.08254) by Hangbo Bao, Li Dong, Furu Wei.
64
+ 1. **[BERT](model_doc/bert)** (from Google) released with the paper [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) by Jacob Devlin, Ming-Wei Chang, Kenton Lee and Kristina Toutanova.
65
+ 1. **[BERT For Sequence Generation](model_doc/bert-generation)** (from Google) released with the paper [Leveraging Pre-trained Checkpoints for Sequence Generation Tasks](https://arxiv.org/abs/1907.12461) by Sascha Rothe, Shashi Narayan, Aliaksei Severyn.
66
+ 1. **[BERTweet](model_doc/bertweet)** (from VinAI Research) released with the paper [BERTweet: A pre-trained language model for English Tweets](https://aclanthology.org/2020.emnlp-demos.2/) by Dat Quoc Nguyen, Thanh Vu and Anh Tuan Nguyen.
67
+ 1. **[BigBird-Pegasus](model_doc/bigbird_pegasus)** (from Google Research) released with the paper [Big Bird: Transformers for Longer Sequences](https://arxiv.org/abs/2007.14062) by Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Amr Ahmed.
68
+ 1. **[BigBird-RoBERTa](model_doc/big_bird)** (from Google Research) released with the paper [Big Bird: Transformers for Longer Sequences](https://arxiv.org/abs/2007.14062) by Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Amr Ahmed.
69
+ 1. **[Blenderbot](model_doc/blenderbot)** (from Facebook) released with the paper [Recipes for building an open-domain chatbot](https://arxiv.org/abs/2004.13637) by Stephen Roller, Emily Dinan, Naman Goyal, Da Ju, Mary Williamson, Yinhan Liu, Jing Xu, Myle Ott, Kurt Shuster, Eric M. Smith, Y-Lan Boureau, Jason Weston.
70
+ 1. **[BlenderbotSmall](model_doc/blenderbot-small)** (from Facebook) released with the paper [Recipes for building an open-domain chatbot](https://arxiv.org/abs/2004.13637) by Stephen Roller, Emily Dinan, Naman Goyal, Da Ju, Mary Williamson, Yinhan Liu, Jing Xu, Myle Ott, Kurt Shuster, Eric M. Smith, Y-Lan Boureau, Jason Weston.
71
+ 1. **[BLOOM](model_doc/bloom)** (from BigScience workshop) released by the [BigScience Workshop](https://bigscience.huggingface.co/).
72
+ 1. **[BORT](model_doc/bort)** (from Alexa) released with the paper [Optimal Subarchitecture Extraction For BERT](https://arxiv.org/abs/2010.10499) by Adrian de Wynter and Daniel J. Perry.
73
+ 1. **[ByT5](model_doc/byt5)** (from Google Research) released with the paper [ByT5: Towards a token-free future with pre-trained byte-to-byte models](https://arxiv.org/abs/2105.13626) by Linting Xue, Aditya Barua, Noah Constant, Rami Al-Rfou, Sharan Narang, Mihir Kale, Adam Roberts, Colin Raffel.
74
+ 1. **[CamemBERT](model_doc/camembert)** (from Inria/Facebook/Sorbonne) released with the paper [CamemBERT: a Tasty French Language Model](https://arxiv.org/abs/1911.03894) by Louis Martin*, Benjamin Muller*, Pedro Javier Ortiz Suárez*, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah and Benoît Sagot.
75
+ 1. **[CANINE](model_doc/canine)** (from Google Research) released with the paper [CANINE: Pre-training an Efficient Tokenization-Free Encoder for Language Representation](https://arxiv.org/abs/2103.06874) by Jonathan H. Clark, Dan Garrette, Iulia Turc, John Wieting.
76
+ 1. **[CLIP](model_doc/clip)** (from OpenAI) released with the paper [Learning Transferable Visual Models From Natural Language Supervision](https://arxiv.org/abs/2103.00020) by Alec Radford, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, Girish Sastry, Amanda Askell, Pamela Mishkin, Jack Clark, Gretchen Krueger, Ilya Sutskever.
77
+ 1. **[CodeGen](model_doc/codegen)** (from Salesforce) released with the paper [A Conversational Paradigm for Program Synthesis](https://arxiv.org/abs/2203.13474) by Erik Nijkamp, Bo Pang, Hiroaki Hayashi, Lifu Tu, Huan Wang, Yingbo Zhou, Silvio Savarese, Caiming Xiong.
78
+ 1. **[ConvBERT](model_doc/convbert)** (from YituTech) released with the paper [ConvBERT: Improving BERT with Span-based Dynamic Convolution](https://arxiv.org/abs/2008.02496) by Zihang Jiang, Weihao Yu, Daquan Zhou, Yunpeng Chen, Jiashi Feng, Shuicheng Yan.
79
+ 1. **[ConvNeXT](model_doc/convnext)** (from Facebook AI) released with the paper [A ConvNet for the 2020s](https://arxiv.org/abs/2201.03545) by Zhuang Liu, Hanzi Mao, Chao-Yuan Wu, Christoph Feichtenhofer, Trevor Darrell, Saining Xie.
80
+ 1. **[ConvNeXTV2](model_doc/convnextv2)** (from Facebook AI) released with the paper [ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders](https://arxiv.org/abs/2301.00808) by Sanghyun Woo, Shoubhik Debnath, Ronghang Hu, Xinlei Chen, Zhuang Liu, In So Kweon, Saining Xie.
81
+ 1. **[CPM](model_doc/cpm)** (from Tsinghua University) released with the paper [CPM: A Large-scale Generative Chinese Pre-trained Language Model](https://arxiv.org/abs/2012.00413) by Zhengyan Zhang, Xu Han, Hao Zhou, Pei Ke, Yuxian Gu, Deming Ye, Yujia Qin, Yusheng Su, Haozhe Ji, Jian Guan, Fanchao Qi, Xiaozhi Wang, Yanan Zheng, Guoyang Zeng, Huanqi Cao, Shengqi Chen, Daixuan Li, Zhenbo Sun, Zhiyuan Liu, Minlie Huang, Wentao Han, Jie Tang, Juanzi Li, Xiaoyan Zhu, Maosong Sun.
82
+ 1. **[CTRL](model_doc/ctrl)** (from Salesforce) released with the paper [CTRL: A Conditional Transformer Language Model for Controllable Generation](https://arxiv.org/abs/1909.05858) by Nitish Shirish Keskar*, Bryan McCann*, Lav R. Varshney, Caiming Xiong and Richard Socher.
83
+ 1. **[CvT](model_doc/cvt)** (from Microsoft) released with the paper [CvT: Introducing Convolutions to Vision Transformers](https://arxiv.org/abs/2103.15808) by Haiping Wu, Bin Xiao, Noel Codella, Mengchen Liu, Xiyang Dai, Lu Yuan, Lei Zhang.
84
+ 1. **[Data2Vec](model_doc/data2vec)** (from Facebook) released with the paper [Data2Vec: A General Framework for Self-supervised Learning in Speech, Vision and Language](https://arxiv.org/abs/2202.03555) by Alexei Baevski, Wei-Ning Hsu, Qiantong Xu, Arun Babu, Jiatao Gu, Michael Auli.
85
+ 1. **[DeBERTa](model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
86
+ 1. **[DeBERTa-v2](model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
87
+ 1. **[Decision Transformer](model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
88
+ 1. **[DeiT](model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
89
+ 1. **[DETR](model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
90
+ 1. **[DialoGPT](model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
91
+ 1. **[DistilBERT](model_doc/distilbert)** (from HuggingFace), released together with the paper [DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter](https://arxiv.org/abs/1910.01108) by Victor Sanh, Lysandre Debut and Thomas Wolf. The same method has been applied to compress GPT2 into [DistilGPT2](https://github.com/huggingface/transformers/tree/main/examples/research_projects/distillation), RoBERTa into [DistilRoBERTa](https://github.com/huggingface/transformers/tree/main/examples/research_projects/distillation), Multilingual BERT into [DistilmBERT](https://github.com/huggingface/transformers/tree/main/examples/research_projects/distillation) and a German version of DistilBERT.
92
+ 1. **[DiT](model_doc/dit)** (from Microsoft Research) released with the paper [DiT: Self-supervised Pre-training for Document Image Transformer](https://arxiv.org/abs/2203.02378) by Junlong Li, Yiheng Xu, Tengchao Lv, Lei Cui, Cha Zhang, Furu Wei.
93
+ 1. **[DPR](model_doc/dpr)** (from Facebook) released with the paper [Dense Passage Retrieval for Open-Domain Question Answering](https://arxiv.org/abs/2004.04906) by Vladimir Karpukhin, Barlas Oğuz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and Wen-tau Yih.
94
+ 1. **[DPT](master/model_doc/dpt)** (from Intel Labs) released with the paper [Vision Transformers for Dense Prediction](https://arxiv.org/abs/2103.13413) by René Ranftl, Alexey Bochkovskiy, Vladlen Koltun.
95
+ 1. **[EfficientNet](model_doc/efficientnet)** (from Google Research) released with the paper [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946) by Mingxing Tan and Quoc V. Le.
96
+ 1. **[ELECTRA](model_doc/electra)** (from Google Research/Stanford University) released with the paper [ELECTRA: Pre-training text encoders as discriminators rather than generators](https://arxiv.org/abs/2003.10555) by Kevin Clark, Minh-Thang Luong, Quoc V. Le, Christopher D. Manning.
97
+ 1. **[EncoderDecoder](model_doc/encoder-decoder)** (from Google Research) released with the paper [Leveraging Pre-trained Checkpoints for Sequence Generation Tasks](https://arxiv.org/abs/1907.12461) by Sascha Rothe, Shashi Narayan, Aliaksei Severyn.
98
+ 1. **[FlauBERT](model_doc/flaubert)** (from CNRS) released with the paper [FlauBERT: Unsupervised Language Model Pre-training for French](https://arxiv.org/abs/1912.05372) by Hang Le, Loïc Vial, Jibril Frej, Vincent Segonne, Maximin Coavoux, Benjamin Lecouteux, Alexandre Allauzen, Benoît Crabbé, Laurent Besacier, Didier Schwab.
99
+ 1. **[FLAVA](model_doc/flava)** (from Facebook AI) released with the paper [FLAVA: A Foundational Language And Vision Alignment Model](https://arxiv.org/abs/2112.04482) by Amanpreet Singh, Ronghang Hu, Vedanuj Goswami, Guillaume Couairon, Wojciech Galuba, Marcus Rohrbach, and Douwe Kiela.
100
+ 1. **[FNet](model_doc/fnet)** (from Google Research) released with the paper [FNet: Mixing Tokens with Fourier Transforms](https://arxiv.org/abs/2105.03824) by James Lee-Thorp, Joshua Ainslie, Ilya Eckstein, Santiago Ontanon.
101
+ 1. **[Funnel Transformer](model_doc/funnel)** (from CMU/Google Brain) released with the paper [Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing](https://arxiv.org/abs/2006.03236) by Zihang Dai, Guokun Lai, Yiming Yang, Quoc V. Le.
102
+ 1. **[GLPN](model_doc/glpn)** (from KAIST) released with the paper [Global-Local Path Networks for Monocular Depth Estimation with Vertical CutDepth](https://arxiv.org/abs/2201.07436) by Doyeon Kim, Woonghyun Ga, Pyungwhan Ahn, Donggyu Joo, Sehwan Chun, Junmo Kim.
103
+ 1. **[GPT](model_doc/openai-gpt)** (from OpenAI) released with the paper [Improving Language Understanding by Generative Pre-Training](https://openai.com/research/language-unsupervised/) by Alec Radford, Karthik Narasimhan, Tim Salimans and Ilya Sutskever.
104
+ 1. **[GPT Neo](model_doc/gpt_neo)** (from EleutherAI) released in the repository [EleutherAI/gpt-neo](https://github.com/EleutherAI/gpt-neo) by Sid Black, Stella Biderman, Leo Gao, Phil Wang and Connor Leahy.
105
+ 1. **[GPT NeoX](model_doc/gpt_neox)** (from EleutherAI) released with the paper [GPT-NeoX-20B: An Open-Source Autoregressive Language Model](https://arxiv.org/abs/2204.06745) by Sid Black, Stella Biderman, Eric Hallahan, Quentin Anthony, Leo Gao, Laurence Golding, Horace He, Connor Leahy, Kyle McDonell, Jason Phang, Michael Pieler, USVSN Sai Prashanth, Shivanshu Purohit, Laria Reynolds, Jonathan Tow, Ben Wang, Samuel Weinbach
106
+ 1. **[GPT-2](model_doc/gpt2)** (from OpenAI) released with the paper [Language Models are Unsupervised Multitask Learners](https://openai.com/research/better-language-models/) by Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei and Ilya Sutskever.
107
+ 1. **[GPT-J](model_doc/gptj)** (from EleutherAI) released in the repository [kingoflolz/mesh-transformer-jax](https://github.com/kingoflolz/mesh-transformer-jax/) by Ben Wang and Aran Komatsuzaki.
108
+ 1. **[GPTSAN-japanese](model_doc/gptsan-japanese)** released in the repository [tanreinama/GPTSAN](https://github.com/tanreinama/GPTSAN/blob/main/report/model.md) by Toshiyuki Sakamoto(tanreinama).
109
+ 1. **[GroupViT](model_doc/groupvit)** (from UCSD, NVIDIA) released with the paper [GroupViT: Semantic Segmentation Emerges from Text Supervision](https://arxiv.org/abs/2202.11094) by Jiarui Xu, Shalini De Mello, Sifei Liu, Wonmin Byeon, Thomas Breuel, Jan Kautz, Xiaolong Wang.
110
+ 1. **[Hubert](model_doc/hubert)** (from Facebook) released with the paper [HuBERT: Self-Supervised Speech Representation Learning by Masked Prediction of Hidden Units](https://arxiv.org/abs/2106.07447) by Wei-Ning Hsu, Benjamin Bolte, Yao-Hung Hubert Tsai, Kushal Lakhotia, Ruslan Salakhutdinov, Abdelrahman Mohamed.
111
+ 1. **[I-BERT](model_doc/ibert)** (from Berkeley) released with the paper [I-BERT: Integer-only BERT Quantization](https://arxiv.org/abs/2101.01321) by Sehoon Kim, Amir Gholami, Zhewei Yao, Michael W. Mahoney, Kurt Keutzer.
112
+ 1. **[ImageGPT](model_doc/imagegpt)** (from OpenAI) released with the paper [Generative Pretraining from Pixels](https://openai.com/blog/image-gpt/) by Mark Chen, Alec Radford, Rewon Child, Jeffrey Wu, Heewoo Jun, David Luan, Ilya Sutskever.
113
+ 1. **[LayoutLM](model_doc/layoutlm)** (from Microsoft Research Asia) released with the paper [LayoutLM: Pre-training of Text and Layout for Document Image Understanding](https://arxiv.org/abs/1912.13318) by Yiheng Xu, Minghao Li, Lei Cui, Shaohan Huang, Furu Wei, Ming Zhou.
114
+ 1. **[LayoutLMv2](model_doc/layoutlmv2)** (from Microsoft Research Asia) released with the paper [LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding](https://arxiv.org/abs/2012.14740) by Yang Xu, Yiheng Xu, Tengchao Lv, Lei Cui, Furu Wei, Guoxin Wang, Yijuan Lu, Dinei Florencio, Cha Zhang, Wanxiang Che, Min Zhang, Lidong Zhou.
115
+ 1. **[LayoutLMv3](model_doc/layoutlmv3)** (from Microsoft Research Asia) released with the paper [LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking](https://arxiv.org/abs/2204.08387) by Yupan Huang, Tengchao Lv, Lei Cui, Yutong Lu, Furu Wei.
116
+ 1. **[LayoutXLM](model_doc/layoutxlm)** (from Microsoft Research Asia) released with the paper [LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding](https://arxiv.org/abs/2104.08836) by Yiheng Xu, Tengchao Lv, Lei Cui, Guoxin Wang, Yijuan Lu, Dinei Florencio, Cha Zhang, Furu Wei.
117
+ 1. **[LED](model_doc/led)** (from AllenAI) released with the paper [Longformer: The Long-Document Transformer](https://arxiv.org/abs/2004.05150) by Iz Beltagy, Matthew E. Peters, Arman Cohan.
118
+ 1. **[LeViT](model_doc/levit)** (from Meta AI) released with the paper [LeViT: A Vision Transformer in ConvNet's Clothing for Faster Inference](https://arxiv.org/abs/2104.01136) by Ben Graham, Alaaeldin El-Nouby, Hugo Touvron, Pierre Stock, Armand Joulin, Hervé Jégou, Matthijs Douze.
119
+ 1. **[Longformer](model_doc/longformer)** (from AllenAI) released with the paper [Longformer: The Long-Document Transformer](https://arxiv.org/abs/2004.05150) by Iz Beltagy, Matthew E. Peters, Arman Cohan.
120
+ 1. **[LongT5](model_doc/longt5)** (from Google AI) released with the paper [LongT5: Efficient Text-To-Text Transformer for Long Sequences](https://arxiv.org/abs/2112.07916) by Mandy Guo, Joshua Ainslie, David Uthus, Santiago Ontanon, Jianmo Ni, Yun-Hsuan Sung, Yinfei Yang.
121
+ 1. **[LUKE](model_doc/luke)** (from Studio Ousia) released with the paper [LUKE: Deep Contextualized Entity Representations with Entity-aware Self-attention](https://arxiv.org/abs/2010.01057) by Ikuya Yamada, Akari Asai, Hiroyuki Shindo, Hideaki Takeda, Yuji Matsumoto.
122
+ 1. **[LXMERT](model_doc/lxmert)** (from UNC Chapel Hill) released with the paper [LXMERT: Learning Cross-Modality Encoder Representations from Transformers for Open-Domain Question Answering](https://arxiv.org/abs/1908.07490) by Hao Tan and Mohit Bansal.
123
+ 1. **[M-CTC-T](model_doc/mctct)** (from Facebook) released with the paper [Pseudo-Labeling For Massively Multilingual Speech Recognition](https://arxiv.org/abs/2111.00161) by Loren Lugosch, Tatiana Likhomanenko, Gabriel Synnaeve, and Ronan Collobert.
124
+ 1. **[M2M100](model_doc/m2m_100)** (from Facebook) released with the paper [Beyond English-Centric Multilingual Machine Translation](https://arxiv.org/abs/2010.11125) by Angela Fan, Shruti Bhosale, Holger Schwenk, Zhiyi Ma, Ahmed El-Kishky, Siddharth Goyal, Mandeep Baines, Onur Celebi, Guillaume Wenzek, Vishrav Chaudhary, Naman Goyal, Tom Birch, Vitaliy Liptchinsky, Sergey Edunov, Edouard Grave, Michael Auli, Armand Joulin.
125
+ 1. **[MarianMT](model_doc/marian)** Machine translation models trained using [OPUS](http://opus.nlpl.eu/) data by Jörg Tiedemann. The [Marian Framework](https://marian-nmt.github.io/) is being developed by the Microsoft Translator Team.
126
+ 1. **[Mask2Former](model_doc/mask2former)** (from FAIR and UIUC) released with the paper [Masked-attention Mask Transformer for Universal Image Segmentation](https://arxiv.org/abs/2112.01527) by Bowen Cheng, Ishan Misra, Alexander G. Schwing, Alexander Kirillov, Rohit Girdhar.
127
+ 1. **[MaskFormer](model_doc/maskformer)** (from Meta and UIUC) released with the paper [Per-Pixel Classification is Not All You Need for Semantic Segmentation](https://arxiv.org/abs/2107.06278) by Bowen Cheng, Alexander G. Schwing, Alexander Kirillov.
128
+ 1. **[mBART](model_doc/mbart)** (from Facebook) released with the paper [Multilingual Denoising Pre-training for Neural Machine Translation](https://arxiv.org/abs/2001.08210) by Yinhan Liu, Jiatao Gu, Naman Goyal, Xian Li, Sergey Edunov, Marjan Ghazvininejad, Mike Lewis, Luke Zettlemoyer.
129
+ 1. **[mBART-50](model_doc/mbart)** (from Facebook) released with the paper [Multilingual Translation with Extensible Multilingual Pretraining and Finetuning](https://arxiv.org/abs/2008.00401) by Yuqing Tang, Chau Tran, Xian Li, Peng-Jen Chen, Naman Goyal, Vishrav Chaudhary, Jiatao Gu, Angela Fan.
130
+ 1. **[Megatron-BERT](model_doc/megatron-bert)** (from NVIDIA) released with the paper [Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism](https://arxiv.org/abs/1909.08053) by Mohammad Shoeybi, Mostofa Patwary, Raul Puri, Patrick LeGresley, Jared Casper and Bryan Catanzaro.
131
+ 1. **[Megatron-GPT2](model_doc/megatron_gpt2)** (from NVIDIA) released with the paper [Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism](https://arxiv.org/abs/1909.08053) by Mohammad Shoeybi, Mostofa Patwary, Raul Puri, Patrick LeGresley, Jared Casper and Bryan Catanzaro.
132
+ 1. **[mLUKE](model_doc/mluke)** (from Studio Ousia) released with the paper [mLUKE: The Power of Entity Representations in Multilingual Pretrained Language Models](https://arxiv.org/abs/2110.08151) by Ryokan Ri, Ikuya Yamada, and Yoshimasa Tsuruoka.
133
+ 1. **[MobileBERT](model_doc/mobilebert)** (from CMU/Google Brain) released with the paper [MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices](https://arxiv.org/abs/2004.02984) by Zhiqing Sun, Hongkun Yu, Xiaodan Song, Renjie Liu, Yiming Yang, and Denny Zhou.
134
+ 1. **[MobileViT](model_doc/mobilevit)** (from Apple) released with the paper [MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer](https://arxiv.org/abs/2110.02178) by Sachin Mehta and Mohammad Rastegari.
135
+ 1. **[MPNet](model_doc/mpnet)** (from Microsoft Research) released with the paper [MPNet: Masked and Permuted Pre-training for Language Understanding](https://arxiv.org/abs/2004.09297) by Kaitao Song, Xu Tan, Tao Qin, Jianfeng Lu, Tie-Yan Liu.
136
+ 1. **[MT5](model_doc/mt5)** (from Google AI) released with the paper [mT5: A massively multilingual pre-trained text-to-text transformer](https://arxiv.org/abs/2010.11934) by Linting Xue, Noah Constant, Adam Roberts, Mihir Kale, Rami Al-Rfou, Aditya Siddhant, Aditya Barua, Colin Raffel.
137
+ 1. **[MVP](model_doc/mvp)** (from RUC AI Box) released with the paper [MVP: Multi-task Supervised Pre-training for Natural Language Generation](https://arxiv.org/abs/2206.12131) by Tianyi Tang, Junyi Li, Wayne Xin Zhao and Ji-Rong Wen.
138
+ 1. **[Nezha](model_doc/nezha)** (from Huawei Noah’s Ark Lab) released with the paper [NEZHA: Neural Contextualized Representation for Chinese Language Understanding](https://arxiv.org/abs/1909.00204) by Junqiu Wei, Xiaozhe Ren, Xiaoguang Li, Wenyong Huang, Yi Liao, Yasheng Wang, Jiashu Lin, Xin Jiang, Xiao Chen and Qun Liu.
139
+ 1. **[NLLB](model_doc/nllb)** (from Meta) released with the paper [No Language Left Behind: Scaling Human-Centered Machine Translation](https://arxiv.org/abs/2207.04672) by the NLLB team.
140
+ 1. **[Nyströmformer](model_doc/nystromformer)** (from the University of Wisconsin - Madison) released with the paper [Nyströmformer: A Nyström-Based Algorithm for Approximating Self-Attention](https://arxiv.org/abs/2102.03902) by Yunyang Xiong, Zhanpeng Zeng, Rudrasis Chakraborty, Mingxing Tan, Glenn Fung, Yin Li, Vikas Singh.
141
+ 1. **[OneFormer](model_doc/oneformer)** (from SHI Labs) released with the paper [OneFormer: One Transformer to Rule Universal Image Segmentation](https://arxiv.org/abs/2211.06220) by Jitesh Jain, Jiachen Li, MangTik Chiu, Ali Hassani, Nikita Orlov, Humphrey Shi.
142
+ 1. **[OPT](master/model_doc/opt)** (from Meta AI) released with the paper [OPT: Open Pre-trained Transformer Language Models](https://arxiv.org/abs/2205.01068) by Susan Zhang, Stephen Roller, Naman Goyal, Mikel Artetxe, Moya Chen, Shuohui Chen et al.
143
+ 1. **[OWL-ViT](model_doc/owlvit)** (from Google AI) released with the paper [Simple Open-Vocabulary Object Detection with Vision Transformers](https://arxiv.org/abs/2205.06230) by Matthias Minderer, Alexey Gritsenko, Austin Stone, Maxim Neumann, Dirk Weissenborn, Alexey Dosovitskiy, Aravindh Mahendran, Anurag Arnab, Mostafa Dehghani, Zhuoran Shen, Xiao Wang, Xiaohua Zhai, Thomas Kipf, and Neil Houlsby.
144
+ 1. **[Pegasus](model_doc/pegasus)** (from Google) released with the paper [PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization](https://arxiv.org/abs/1912.08777) by Jingqing Zhang, Yao Zhao, Mohammad Saleh and Peter J. Liu.
145
+ 1. **[Perceiver IO](model_doc/perceiver)** (from Deepmind) released with the paper [Perceiver IO: A General Architecture for Structured Inputs & Outputs](https://arxiv.org/abs/2107.14795) by Andrew Jaegle, Sebastian Borgeaud, Jean-Baptiste Alayrac, Carl Doersch, Catalin Ionescu, David Ding, Skanda Koppula, Daniel Zoran, Andrew Brock, Evan Shelhamer, Olivier Hénaff, Matthew M. Botvinick, Andrew Zisserman, Oriol Vinyals, João Carreira.
146
+ 1. **[PhoBERT](model_doc/phobert)** (from VinAI Research) released with the paper [PhoBERT: Pre-trained language models for Vietnamese](https://www.aclweb.org/anthology/2020.findings-emnlp.92/) by Dat Quoc Nguyen and Anh Tuan Nguyen.
147
+ 1. **[PLBart](model_doc/plbart)** (from UCLA NLP) released with the paper [Unified Pre-training for Program Understanding and Generation](https://arxiv.org/abs/2103.06333) by Wasi Uddin Ahmad, Saikat Chakraborty, Baishakhi Ray, Kai-Wei Chang.
148
+ 1. **[PoolFormer](model_doc/poolformer)** (from Sea AI Labs) released with the paper [MetaFormer is Actually What You Need for Vision](https://arxiv.org/abs/2111.11418) by Yu, Weihao and Luo, Mi and Zhou, Pan and Si, Chenyang and Zhou, Yichen and Wang, Xinchao and Feng, Jiashi and Yan, Shuicheng.
149
+ 1. **[ProphetNet](model_doc/prophetnet)** (from Microsoft Research) released with the paper [ProphetNet: Predicting Future N-gram for Sequence-to-Sequence Pre-training](https://arxiv.org/abs/2001.04063) by Yu Yan, Weizhen Qi, Yeyun Gong, Dayiheng Liu, Nan Duan, Jiusheng Chen, Ruofei Zhang and Ming Zhou.
150
+ 1. **[QDQBert](model_doc/qdqbert)** (from NVIDIA) released with the paper [Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation](https://arxiv.org/abs/2004.09602) by Hao Wu, Patrick Judd, Xiaojie Zhang, Mikhail Isaev and Paulius Micikevicius.
151
+ 1. **[RAG](model_doc/rag)** (from Facebook) released with the paper [Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks](https://arxiv.org/abs/2005.11401) by Patrick Lewis, Ethan Perez, Aleksandara Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich Küttler, Mike Lewis, Wen-tau Yih, Tim Rocktäschel, Sebastian Riedel, Douwe Kiela.
152
+ 1. **[REALM](model_doc/realm.html)** (from Google Research) released with the paper [REALM: Retrieval-Augmented Language Model Pre-Training](https://arxiv.org/abs/2002.08909) by Kelvin Guu, Kenton Lee, Zora Tung, Panupong Pasupat and Ming-Wei Chang.
153
+ 1. **[Reformer](model_doc/reformer)** (from Google Research) released with the paper [Reformer: The Efficient Transformer](https://arxiv.org/abs/2001.04451) by Nikita Kitaev, Łukasz Kaiser, Anselm Levskaya.
154
+ 1. **[RegNet](model_doc/regnet)** (from META Platforms) released with the paper [Designing Network Design Space](https://arxiv.org/abs/2003.13678) by Ilija Radosavovic, Raj Prateek Kosaraju, Ross Girshick, Kaiming He, Piotr Dollár.
155
+ 1. **[RemBERT](model_doc/rembert)** (from Google Research) released with the paper [Rethinking embedding coupling in pre-trained language models](https://arxiv.org/abs/2010.12821) by Hyung Won Chung, Thibault Févry, Henry Tsai, M. Johnson, Sebastian Ruder.
156
+ 1. **[ResNet](model_doc/resnet)** (from Microsoft Research) released with the paper [Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385) by Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun.
157
+ 1. **[RoBERTa](model_doc/roberta)** (from Facebook), released together with the paper [RoBERTa: A Robustly Optimized BERT Pretraining Approach](https://arxiv.org/abs/1907.11692) by Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov.
158
+ 1. **[RoFormer](model_doc/roformer)** (from ZhuiyiTechnology), released together with the paper [RoFormer: Enhanced Transformer with Rotary Position Embedding](https://arxiv.org/abs/2104.09864) by Jianlin Su and Yu Lu and Shengfeng Pan and Bo Wen and Yunfeng Liu.
159
+ 1. **[SegFormer](model_doc/segformer)** (from NVIDIA) released with the paper [SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers](https://arxiv.org/abs/2105.15203) by Enze Xie, Wenhai Wang, Zhiding Yu, Anima Anandkumar, Jose M. Alvarez, Ping Luo.
160
+ 1. **[SEW](model_doc/sew)** (from ASAPP) released with the paper [Performance-Efficiency Trade-offs in Unsupervised Pre-training for Speech Recognition](https://arxiv.org/abs/2109.06870) by Felix Wu, Kwangyoun Kim, Jing Pan, Kyu Han, Kilian Q. Weinberger, Yoav Artzi.
161
+ 1. **[SEW-D](model_doc/sew_d)** (from ASAPP) released with the paper [Performance-Efficiency Trade-offs in Unsupervised Pre-training for Speech Recognition](https://arxiv.org/abs/2109.06870) by Felix Wu, Kwangyoun Kim, Jing Pan, Kyu Han, Kilian Q. Weinberger, Yoav Artzi.
162
+ 1. **[SpeechToTextTransformer](model_doc/speech_to_text)** (from Facebook), released together with the paper [fairseq S2T: Fast Speech-to-Text Modeling with fairseq](https://arxiv.org/abs/2010.05171) by Changhan Wang, Yun Tang, Xutai Ma, Anne Wu, Dmytro Okhonko, Juan Pino.
163
+ 1. **[SpeechToTextTransformer2](model_doc/speech_to_text_2)** (from Facebook), released together with the paper [Large-Scale Self- and Semi-Supervised Learning for Speech Translation](https://arxiv.org/abs/2104.06678) by Changhan Wang, Anne Wu, Juan Pino, Alexei Baevski, Michael Auli, Alexis Conneau.
164
+ 1. **[Splinter](model_doc/splinter)** (from Tel Aviv University), released together with the paper [Few-Shot Question Answering by Pretraining Span Selection](https://arxiv.org/abs/2101.00438) by Ori Ram, Yuval Kirstain, Jonathan Berant, Amir Globerson, Omer Levy.
165
+ 1. **[SqueezeBERT](model_doc/squeezebert)** (from Berkeley) released with the paper [SqueezeBERT: What can computer vision teach NLP about efficient neural networks?](https://arxiv.org/abs/2006.11316) by Forrest N. Iandola, Albert E. Shaw, Ravi Krishna, and Kurt W. Keutzer.
166
+ 1. **[Swin Transformer](model_doc/swin)** (from Microsoft) released with the paper [Swin Transformer: Hierarchical Vision Transformer using Shifted Windows](https://arxiv.org/abs/2103.14030) by Ze Liu, Yutong Lin, Yue Cao, Han Hu, Yixuan Wei, Zheng Zhang, Stephen Lin, Baining Guo.
167
+ 1. **[Swin Transformer V2](model_doc/swinv2)** (from Microsoft) released with the paper [Swin Transformer V2: Scaling Up Capacity and Resolution](https://arxiv.org/abs/2111.09883) by Ze Liu, Han Hu, Yutong Lin, Zhuliang Yao, Zhenda Xie, Yixuan Wei, Jia Ning, Yue Cao, Zheng Zhang, Li Dong, Furu Wei, Baining Guo.
168
+ 1. **[T5](model_doc/t5)** (from Google AI) released with the paper [Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer](https://arxiv.org/abs/1910.10683) by Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu.
169
+ 1. **[T5v1.1](model_doc/t5v1.1)** (from Google AI) released in the repository [google-research/text-to-text-transfer-transformer](https://github.com/google-research/text-to-text-transfer-transformer/blob/main/released_checkpoints.md#t511) by Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu.
170
+ 1. **[TAPAS](model_doc/tapas)** (from Google AI) released with the paper [TAPAS: Weakly Supervised Table Parsing via Pre-training](https://arxiv.org/abs/2004.02349) by Jonathan Herzig, Paweł Krzysztof Nowak, Thomas Müller, Francesco Piccinno and Julian Martin Eisenschlos.
171
+ 1. **[TAPEX](model_doc/tapex)** (from Microsoft Research) released with the paper [TAPEX: Table Pre-training via Learning a Neural SQL Executor](https://arxiv.org/abs/2107.07653) by Qian Liu, Bei Chen, Jiaqi Guo, Morteza Ziyadi, Zeqi Lin, Weizhu Chen, Jian-Guang Lou.
172
+ 1. **[Trajectory Transformer](model_doc/trajectory_transformers)** (from the University of California at Berkeley) released with the paper [Offline Reinforcement Learning as One Big Sequence Modeling Problem](https://arxiv.org/abs/2106.02039) by Michael Janner, Qiyang Li, Sergey Levine
173
+ 1. **[Transformer-XL](model_doc/transfo-xl)** (from Google/CMU) released with the paper [Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context](https://arxiv.org/abs/1901.02860) by Zihang Dai*, Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov.
174
+ 1. **[TrOCR](model_doc/trocr)** (from Microsoft), released together with the paper [TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models](https://arxiv.org/abs/2109.10282) by Minghao Li, Tengchao Lv, Lei Cui, Yijuan Lu, Dinei Florencio, Cha Zhang, Zhoujun Li, Furu Wei.
175
+ 1. **[UL2](model_doc/ul2)** (from Google Research) released with the paper [Unifying Language Learning Paradigms](https://arxiv.org/abs/2205.05131v1) by Yi Tay, Mostafa Dehghani, Vinh Q. Tran, Xavier Garcia, Dara Bahri, Tal Schuster, Huaixiu Steven Zheng, Neil Houlsby, Donald Metzler
176
+ 1. **[UMT5](model_doc/umt5)** (from Google Research) released with the paper [UniMax: Fairer and More Effective Language Sampling for Large-Scale Multilingual Pretraining](https://openreview.net/forum?id=kXwdL1cWOAi) by Hyung Won Chung, Xavier Garcia, Adam Roberts, Yi Tay, Orhan Firat, Sharan Narang, Noah Constant.
177
+ 1. **[UniSpeech](model_doc/unispeech)** (from Microsoft Research) released with the paper [UniSpeech: Unified Speech Representation Learning with Labeled and Unlabeled Data](https://arxiv.org/abs/2101.07597) by Chengyi Wang, Yu Wu, Yao Qian, Kenichi Kumatani, Shujie Liu, Furu Wei, Michael Zeng, Xuedong Huang.
178
+ 1. **[UniSpeechSat](model_doc/unispeech-sat)** (from Microsoft Research) released with the paper [UNISPEECH-SAT: UNIVERSAL SPEECH REPRESENTATION LEARNING WITH SPEAKER AWARE PRE-TRAINING](https://arxiv.org/abs/2110.05752) by Sanyuan Chen, Yu Wu, Chengyi Wang, Zhengyang Chen, Zhuo Chen, Shujie Liu, Jian Wu, Yao Qian, Furu Wei, Jinyu Li, Xiangzhan Yu.
179
+ 1. **[VAN](model_doc/van)** (from Tsinghua University and Nankai University) released with the paper [Visual Attention Network](https://arxiv.org/abs/2202.09741) by Meng-Hao Guo, Cheng-Ze Lu, Zheng-Ning Liu, Ming-Ming Cheng, Shi-Min Hu.
180
+ 1. **[VideoMAE](model_doc/videomae)** (from Multimedia Computing Group, Nanjing University) released with the paper [VideoMAE: Masked Autoencoders are Data-Efficient Learners for Self-Supervised Video Pre-Training](https://arxiv.org/abs/2203.12602) by Zhan Tong, Yibing Song, Jue Wang, Limin Wang.
181
+ 1. **[ViLT](model_doc/vilt)** (from NAVER AI Lab/Kakao Enterprise/Kakao Brain) released with the paper [ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision](https://arxiv.org/abs/2102.03334) by Wonjae Kim, Bokyung Son, Ildoo Kim.
182
+ 1. **[Vision Transformer (ViT)](model_doc/vit)** (from Google AI) released with the paper [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale](https://arxiv.org/abs/2010.11929) by Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby.
183
+ 1. **[VisualBERT](model_doc/visual_bert)** (from UCLA NLP) released with the paper [VisualBERT: A Simple and Performant Baseline for Vision and Language](https://arxiv.org/pdf/1908.03557) by Liunian Harold Li, Mark Yatskar, Da Yin, Cho-Jui Hsieh, Kai-Wei Chang.
184
+ 1. **[ViTMAE](model_doc/vit_mae)** (from Meta AI) released with the paper [Masked Autoencoders Are Scalable Vision Learners](https://arxiv.org/abs/2111.06377) by Kaiming He, Xinlei Chen, Saining Xie, Yanghao Li, Piotr Dollár, Ross Girshick.
185
+ 1. **[Wav2Vec2](model_doc/wav2vec2)** (from Facebook AI) released with the paper [wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations](https://arxiv.org/abs/2006.11477) by Alexei Baevski, Henry Zhou, Abdelrahman Mohamed, Michael Auli.
186
+ 1. **[Wav2Vec2-Conformer](model_doc/wav2vec2-conformer)** (from Facebook AI) released with the paper [FAIRSEQ S2T: Fast Speech-to-Text Modeling with FAIRSEQ](https://arxiv.org/abs/2010.05171) by Changhan Wang, Yun Tang, Xutai Ma, Anne Wu, Sravya Popuri, Dmytro Okhonko, Juan Pino.
187
+ 1. **[Wav2Vec2Phoneme](model_doc/wav2vec2_phoneme)** (from Facebook AI) released with the paper [Simple and Effective Zero-shot Cross-lingual Phoneme Recognition](https://arxiv.org/abs/2109.11680) by Qiantong Xu, Alexei Baevski, Michael Auli.
188
+ 1. **[WavLM](model_doc/wavlm)** (from Microsoft Research) released with the paper [WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing](https://arxiv.org/abs/2110.13900) by Sanyuan Chen, Chengyi Wang, Zhengyang Chen, Yu Wu, Shujie Liu, Zhuo Chen, Jinyu Li, Naoyuki Kanda, Takuya Yoshioka, Xiong Xiao, Jian Wu, Long Zhou, Shuo Ren, Yanmin Qian, Yao Qian, Jian Wu, Michael Zeng, Furu Wei.
189
+ 1. **[XGLM](model_doc/xglm)** (From Facebook AI) released with the paper [Few-shot Learning with Multilingual Language Models](https://arxiv.org/abs/2112.10668) by Xi Victoria Lin, Todor Mihaylov, Mikel Artetxe, Tianlu Wang, Shuohui Chen, Daniel Simig, Myle Ott, Naman Goyal, Shruti Bhosale, Jingfei Du, Ramakanth Pasunuru, Sam Shleifer, Punit Singh Koura, Vishrav Chaudhary, Brian O'Horo, Jeff Wang, Luke Zettlemoyer, Zornitsa Kozareva, Mona Diab, Veselin Stoyanov, Xian Li.
190
+ 1. **[XLM](model_doc/xlm)** (from Facebook) released together with the paper [Cross-lingual Language Model Pretraining](https://arxiv.org/abs/1901.07291) by Guillaume Lample and Alexis Conneau.
191
+ 1. **[XLM-ProphetNet](model_doc/xlm-prophetnet)** (from Microsoft Research) released with the paper [ProphetNet: Predicting Future N-gram for Sequence-to-Sequence Pre-training](https://arxiv.org/abs/2001.04063) by Yu Yan, Weizhen Qi, Yeyun Gong, Dayiheng Liu, Nan Duan, Jiusheng Chen, Ruofei Zhang and Ming Zhou.
192
+ 1. **[XLM-RoBERTa](model_doc/xlm-roberta)** (from Facebook AI), released together with the paper [Unsupervised Cross-lingual Representation Learning at Scale](https://arxiv.org/abs/1911.02116) by Alexis Conneau*, Kartikay Khandelwal*, Naman Goyal, Vishrav Chaudhary, Guillaume Wenzek, Francisco Guzmán, Edouard Grave, Myle Ott, Luke Zettlemoyer and Veselin Stoyanov.
193
+ 1. **[XLM-RoBERTa-XL](model_doc/xlm-roberta-xl)** (from Facebook AI), released together with the paper [Larger-Scale Transformers for Multilingual Masked Language Modeling](https://arxiv.org/abs/2105.00572) by Naman Goyal, Jingfei Du, Myle Ott, Giri Anantharaman, Alexis Conneau.
194
+ 1. **[XLM-V](model_doc/xlm-v)** (from Meta AI) released with the paper [XLM-V: Overcoming the Vocabulary Bottleneck in Multilingual Masked Language Models](https://arxiv.org/abs/2301.10472) by Davis Liang, Hila Gonen, Yuning Mao, Rui Hou, Naman Goyal, Marjan Ghazvininejad, Luke Zettlemoyer, Madian Khabsa.
195
+ 1. **[XLNet](model_doc/xlnet)** (from Google/CMU) released with the paper [​XLNet: Generalized Autoregressive Pretraining for Language Understanding](https://arxiv.org/abs/1906.08237) by Zhilin Yang*, Zihang Dai*, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, Quoc V. Le.
196
+ 1. **[XLS-R](model_doc/xls_r)** (from Facebook AI) released with the paper [XLS-R: Self-supervised Cross-lingual Speech Representation Learning at Scale](https://arxiv.org/abs/2111.09296) by Arun Babu, Changhan Wang, Andros Tjandra, Kushal Lakhotia, Qiantong Xu, Naman Goyal, Kritika Singh, Patrick von Platen, Yatharth Saraf, Juan Pino, Alexei Baevski, Alexis Conneau, Michael Auli.
197
+ 1. **[XLSR-Wav2Vec2](model_doc/xlsr_wav2vec2)** (from Facebook AI) released with the paper [Unsupervised Cross-Lingual Representation Learning For Speech Recognition](https://arxiv.org/abs/2006.13979) by Alexis Conneau, Alexei Baevski, Ronan Collobert, Abdelrahman Mohamed, Michael Auli.
198
+ 1. **[YOLOS](model_doc/yolos)** (from Huazhong University of Science & Technology) released with the paper [You Only Look at One Sequence: Rethinking Transformer in Vision through Object Detection](https://arxiv.org/abs/2106.00666) by Yuxin Fang, Bencheng Liao, Xinggang Wang, Jiemin Fang, Jiyang Qi, Rui Wu, Jianwei Niu, Wenyu Liu.
199
+ 1. **[YOSO](model_doc/yoso)** (from the University of Wisconsin - Madison) released with the paper [You Only Sample (Almost) Once: Linear Cost Self-Attention Via Bernoulli Sampling](https://arxiv.org/abs/2111.09714) by Zhanpeng Zeng, Yunyang Xiong, Sathya N. Ravi, Shailesh Acharya, Glenn Fung, Vikas Singh.
200
+
201
+
202
+ ### Unterstützte Frameworks
203
+
204
+ Die folgende Tabelle zeigt die derzeitige Unterstützung in der Bibliothek für jedes dieser Modelle, unabhängig davon, ob sie einen Python
205
+ Tokenizer haben (als "langsam" bezeichnet), ein "schneller" Tokenizer, der von der 🤗 Tokenizers Bibliothek unterstützt wird, ob sie Unterstützung in Jax (via
206
+ Flax), PyTorch, und/oder TensorFlow haben.
207
+
208
+ <!--This table is updated automatically from the auto modules with _make fix-copies_. Do not update manually!-->
209
+
210
+ | Model | Tokenizer slow | Tokenizer fast | PyTorch support | TensorFlow support | Flax Support |
211
+ |:---------------------------:|:--------------:|:--------------:|:---------------:|:------------------:|:------------:|
212
+ | ALBERT | ✅ | ✅ | ✅ | ✅ | ✅ |
213
+ | BART | ✅ | ✅ | ✅ | ✅ | ✅ |
214
+ | BEiT | ❌ | ❌ | ✅ | ❌ | ✅ |
215
+ | BERT | ✅ | ✅ | ✅ | ✅ | ✅ |
216
+ | Bert Generation | ✅ | ❌ | ✅ | ❌ | ❌ |
217
+ | BigBird | ✅ | ✅ | ✅ | ❌ | ✅ |
218
+ | BigBird-Pegasus | ❌ | ❌ | ✅ | ❌ | ❌ |
219
+ | Blenderbot | ✅ | ✅ | ✅ | ✅ | ✅ |
220
+ | BlenderbotSmall | ✅ | ✅ | ✅ | ✅ | ✅ |
221
+ | BLOOM | ❌ | ✅ | ✅ | ❌ | ✅ |
222
+ | CamemBERT | ✅ | ✅ | ✅ | ✅ | ❌ |
223
+ | CANINE | ✅ | ❌ | ✅ | ❌ | ❌ |
224
+ | CLIP | ✅ | ✅ | ✅ | ✅ | ✅ |
225
+ | CodeGen | ✅ | ✅ | ✅ | ❌ | ❌ |
226
+ | ConvBERT | ✅ | ✅ | ✅ | ✅ | ❌ |
227
+ | ConvNeXT | ❌ | ❌ | ✅ | ✅ | ❌ |
228
+ | CTRL | ✅ | ❌ | ✅ | ✅ | ❌ |
229
+ | CvT | ❌ | ❌ | ✅ | ❌ | ❌ |
230
+ | Data2VecAudio | ❌ | ❌ | ✅ | ❌ | ❌ |
231
+ | Data2VecText | ❌ | ❌ | ✅ | ❌ | ❌ |
232
+ | Data2VecVision | ❌ | ❌ | ✅ | ✅ | ❌ |
233
+ | DeBERTa | ✅ | ✅ | ✅ | ✅ | ❌ |
234
+ | DeBERTa-v2 | ✅ | ✅ | ✅ | ✅ | ❌ |
235
+ | Decision Transformer | ❌ | ❌ | ✅ | ❌ | ❌ |
236
+ | DeiT | ❌ | ❌ | ✅ | ✅ | ❌ |
237
+ | DETR | ❌ | ❌ | ✅ | ❌ | ❌ |
238
+ | DistilBERT | ✅ | ✅ | ✅ | ✅ | ✅ |
239
+ | DPR | ✅ | ✅ | ✅ | ✅ | ❌ |
240
+ | DPT | ❌ | ❌ | ✅ | ❌ | ❌ |
241
+ | ELECTRA | ✅ | ✅ | ✅ | ✅ | ✅ |
242
+ | Encoder decoder | ❌ | ❌ | ✅ | ✅ | ✅ |
243
+ | FairSeq Machine-Translation | ✅ | ❌ | ✅ | ❌ | ❌ |
244
+ | FlauBERT | ✅ | ❌ | ✅ | ✅ | ❌ |
245
+ | FLAVA | ❌ | ❌ | ✅ | ❌ | ❌ |
246
+ | FNet | ✅ | ✅ | ✅ | ❌ | ❌ |
247
+ | Funnel Transformer | ✅ | ✅ | ✅ | ✅ | ❌ |
248
+ | GLPN | ❌ | ❌ | ✅ | ❌ | ❌ |
249
+ | GPT Neo | ❌ | ❌ | ✅ | ❌ | ✅ |
250
+ | GPT NeoX | ❌ | ✅ | ✅ | ❌ | ❌ |
251
+ | GPT-J | ❌ | ❌ | ✅ | ✅ | ✅ |
252
+ | GroupViT | ❌ | ❌ | ✅ | ❌ | ❌ |
253
+ | Hubert | ❌ | ❌ | ✅ | ��� | ❌ |
254
+ | I-BERT | ❌ | ❌ | ✅ | ❌ | ❌ |
255
+ | ImageGPT | ❌ | ❌ | ✅ | ❌ | ❌ |
256
+ | LayoutLM | ✅ | ✅ | ✅ | ✅ | ❌ |
257
+ | LayoutLMv2 | ✅ | ✅ | ✅ | ❌ | ❌ |
258
+ | LayoutLMv3 | ✅ | ✅ | ✅ | ❌ | ❌ |
259
+ | LED | ✅ | ✅ | ✅ | ✅ | ❌ |
260
+ | LeViT | ❌ | ❌ | ✅ | ❌ | ❌ |
261
+ | Longformer | ✅ | ✅ | ✅ | ✅ | ❌ |
262
+ | LongT5 | ❌ | ❌ | ✅ | ❌ | ✅ |
263
+ | LUKE | ✅ | ❌ | ✅ | ❌ | ❌ |
264
+ | LXMERT | ✅ | ✅ | ✅ | ✅ | ❌ |
265
+ | M-CTC-T | ❌ | ❌ | ✅ | ❌ | ❌ |
266
+ | M2M100 | ✅ | ❌ | ✅ | ❌ | ❌ |
267
+ | Marian | ✅ | ❌ | ✅ | ✅ | ✅ |
268
+ | MaskFormer | ❌ | ❌ | ✅ | ❌ | ❌ |
269
+ | mBART | ✅ | ✅ | ✅ | ✅ | ✅ |
270
+ | Megatron-BERT | ❌ | ❌ | ✅ | ❌ | ❌ |
271
+ | MobileBERT | ✅ | ✅ | ✅ | ✅ | ❌ |
272
+ | MobileViT | ❌ | ❌ | ✅ | ❌ | ❌ |
273
+ | MPNet | ✅ | ✅ | ✅ | ✅ | ❌ |
274
+ | MT5 | ✅ | ✅ | ✅ | ✅ | ✅ |
275
+ | MVP | ✅ | ✅ | ✅ | ❌ | ❌ |
276
+ | Nezha | ❌ | ❌ | ✅ | ❌ | ❌ |
277
+ | Nyströmformer | ❌ | ❌ | ✅ | ❌ | ❌ |
278
+ | OpenAI GPT | ✅ | ✅ | ✅ | ✅ | ❌ |
279
+ | OpenAI GPT-2 | ✅ | ✅ | ✅ | ✅ | ✅ |
280
+ | OPT | ❌ | ❌ | ✅ | ✅ | ✅ |
281
+ | OWL-ViT | ❌ | ❌ | ✅ | ❌ | ❌ |
282
+ | Pegasus | ✅ | ✅ | ✅ | ✅ | ✅ |
283
+ | Perceiver | ✅ | ❌ | ✅ | ❌ | ❌ |
284
+ | PLBart | ✅ | ❌ | ✅ | ❌ | ❌ |
285
+ | PoolFormer | ❌ | ❌ | ✅ | ❌ | ❌ |
286
+ | ProphetNet | ✅ | ❌ | ✅ | ❌ | ❌ |
287
+ | QDQBert | ❌ | ❌ | ✅ | ❌ | ❌ |
288
+ | RAG | ✅ | ❌ | ✅ | ✅ | ❌ |
289
+ | REALM | ✅ | ✅ | ✅ | ❌ | ❌ |
290
+ | Reformer | ✅ | ✅ | ✅ | ❌ | ❌ |
291
+ | RegNet | ❌ | ❌ | ✅ | ✅ | ✅ |
292
+ | RemBERT | ✅ | ✅ | ✅ | ✅ | ❌ |
293
+ | ResNet | ❌ | ❌ | ✅ | ✅ | ✅ |
294
+ | RetriBERT | ✅ | ✅ | ✅ | ❌ | ❌ |
295
+ | RoBERTa | ✅ | ✅ | ✅ | ✅ | ✅ |
296
+ | RoFormer | ✅ | ✅ | ✅ | ✅ | ✅ |
297
+ | SegFormer | ❌ | ❌ | ✅ | ✅ | ❌ |
298
+ | SEW | ❌ | ❌ | ✅ | ❌ | ❌ |
299
+ | SEW-D | ❌ | ❌ | ✅ | ❌ | ❌ |
300
+ | Speech Encoder decoder | ❌ | ❌ | ✅ | ❌ | ✅ |
301
+ | Speech2Text | ✅ | ❌ | ✅ | ✅ | ❌ |
302
+ | Speech2Text2 | ✅ | ❌ | ❌ | ❌ | ❌ |
303
+ | Splinter | ✅ | ✅ | ✅ | ❌ | ❌ |
304
+ | SqueezeBERT | ✅ | ✅ | ✅ | ❌ | ❌ |
305
+ | Swin Transformer | ❌ | ❌ | ✅ | ✅ | ❌ |
306
+ | Swin Transformer V2 | ❌ | ❌ | ✅ | ❌ | ❌ |
307
+ | T5 | ✅ | ✅ | ✅ | ✅ | ✅ |
308
+ | TAPAS | ✅ | ❌ | ✅ | ✅ | ❌ |
309
+ | Trajectory Transformer | ❌ | ❌ | ✅ | ❌ | ❌ |
310
+ | Transformer-XL | ✅ | ❌ | ✅ | ✅ | ❌ |
311
+ | TrOCR | ❌ | ❌ | ✅ | ❌ | ❌ |
312
+ | UniSpeech | ❌ | ❌ | ✅ | ❌ | ❌ |
313
+ | UniSpeechSat | ❌ | ❌ | ✅ | ❌ | ❌ |
314
+ | VAN | ❌ | ❌ | ✅ | ❌ | ❌ |
315
+ | VideoMAE | ❌ | ❌ | ✅ | ❌ | ❌ |
316
+ | ViLT | ❌ | ❌ | ✅ | ❌ | ❌ |
317
+ | Vision Encoder decoder | ❌ | ❌ | ✅ | ✅ | ✅ |
318
+ | VisionTextDualEncoder | ❌ | ❌ | ✅ | ❌ | ✅ |
319
+ | VisualBERT | ❌ | ❌ | ✅ | ❌ | ❌ |
320
+ | ViT | ❌ | ❌ | ✅ | ✅ | ✅ |
321
+ | ViTMAE | ❌ | ❌ | ✅ | ✅ | ❌ |
322
+ | Wav2Vec2 | ✅ | ❌ | ✅ | ✅ | ✅ |
323
+ | Wav2Vec2-Conformer | ❌ | ❌ | ✅ | ❌ | ❌ |
324
+ | WavLM | ❌ | ❌ | ✅ | ❌ | ❌ |
325
+ | XGLM | ✅ | ✅ | ✅ | ❌ | ✅ |
326
+ | XLM | ✅ | ❌ | ✅ | ✅ | ❌ |
327
+ | XLM-ProphetNet | ✅ | ❌ | ✅ | ❌ | ❌ |
328
+ | XLM-RoBERTa | ✅ | ✅ | ✅ | ✅ | ✅ |
329
+ | XLM-RoBERTa-XL | ❌ | ❌ | ✅ | ❌ | ❌ |
330
+ | XLNet | ✅ | ✅ | ✅ | ✅ | ❌ |
331
+ | YOLOS | ❌ | ❌ | ✅ | ❌ | ❌ |
332
+ | YOSO | ❌ | ❌ | ✅ | ❌ | ❌ |
333
+
334
+ <!-- End table-->
docs/source/de/installation.md ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2022 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+
16
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
17
+ rendered properly in your Markdown viewer.
18
+
19
+ -->
20
+
21
+ # Installation
22
+
23
+ Installieren Sie 🤗 Transformers für die Deep-Learning-Bibliothek, mit der Sie arbeiten, richten Sie Ihren Cache ein und konfigurieren Sie 🤗 Transformers optional für den Offline-Betrieb.
24
+
25
+ 🤗 Transformers wurde unter Python 3.6+, PyTorch 1.1.0+, TensorFlow 2.0+, und Flax getestet. Folgen Sie den Installationsanweisungen unten für die von Ihnen verwendete Deep-Learning-Bibliothek:
26
+
27
+ * [PyTorch](https://pytorch.org/get-started/locally/) installation instructions.
28
+ * [TensorFlow 2.0](https://www.tensorflow.org/install/pip) installation instructions.
29
+ * [Flax](https://flax.readthedocs.io/en/latest/) installation instructions.
30
+
31
+ ## Installation mit pip
32
+
33
+ Sie sollten 🤗 Transformers in einer [virtuellen Umgebung](https://docs.python.org/3/library/venv.html) installieren. Wenn Sie mit virtuellen Python-Umgebungen nicht vertraut sind, werfen Sie einen Blick auf diese [Anleitung](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/). Eine virtuelle Umgebung macht es einfacher, verschiedene Projekte zu verwalten und Kompatibilitätsprobleme zwischen Abhängigkeiten zu vermeiden.
34
+
35
+ Beginnen wir mit der Erstellung einer virtuellen Umgebung in Ihrem Projektverzeichnis:
36
+
37
+
38
+ ```bash
39
+ python -m venv .env
40
+ ```
41
+
42
+ Aktivieren wir die virtuelle Umgebung. Unter Linux und MacOs:
43
+
44
+ ```bash
45
+ source .env/bin/activate
46
+ ```
47
+ Aktivieren wir die virtuelle Umgebung unter Windows
48
+
49
+ ```bash
50
+ .env/Scripts/activate
51
+ ```
52
+
53
+ Jetzt können wir die 🤗 Transformers mit dem folgenden Befehl installieren:
54
+
55
+ ```bash
56
+ pip install transformers
57
+ ```
58
+
59
+ Bei reiner CPU-Unterstützung können wir 🤗 Transformers und eine Deep-Learning-Bibliothek bequem in einer Zeile installieren. Installieren wir zum Beispiel 🤗 Transformers und PyTorch mit:
60
+
61
+ ```bash
62
+ pip install transformers[torch]
63
+ ```
64
+
65
+ 🤗 Transformers und TensorFlow 2.0:
66
+
67
+ ```bash
68
+ pip install transformers[tf-cpu]
69
+ ```
70
+
71
+ 🤗 Transformers und Flax:
72
+
73
+ ```bash
74
+ pip install transformers[flax]
75
+ ```
76
+
77
+ Überprüfen wir abschließend, ob 🤗 Transformers ordnungsgemäß installiert wurde, indem wir den folgenden Befehl ausführen. Es wird ein vortrainiertes Modell heruntergeladen:
78
+
79
+ ```bash
80
+ python -c "from transformers import pipeline; print(pipeline('sentiment-analysis')('we love you'))"
81
+ ```
82
+
83
+ Dann wird die Kategorie und die Wahrscheinlichkeit ausgegeben:
84
+
85
+ ```bash
86
+ [{'label': 'POSITIVE', 'score': 0.9998704791069031}]
87
+ ```
88
+
89
+ ## Installation aus dem Code
90
+
91
+ Installieren wir 🤗 Transformers aus dem Quellcode mit dem folgenden Befehl:
92
+
93
+ ```bash
94
+ pip install git+https://github.com/huggingface/transformers
95
+ ```
96
+
97
+ Dieser Befehl installiert die aktuelle `main` Version und nicht die neueste `stable` Version. Die `main`-Version ist nützlich, um mit den neuesten Entwicklungen Schritt zu halten. Zum Beispiel, wenn ein Fehler seit der letzten offiziellen Version behoben wurde, aber eine neue Version noch nicht veröffentlicht wurde. Das bedeutet jedoch, dass die "Hauptversion" nicht immer stabil ist. Wir bemühen uns, die Hauptversion einsatzbereit zu halten, und die meisten Probleme werden normalerweise innerhalb weniger Stunden oder eines Tages behoben. Wenn Sie auf ein Problem stoßen, öffnen Sie bitte ein [Issue](https://github.com/huggingface/transformers/issues), damit wir es noch schneller beheben können!
98
+
99
+ Überprüfen wir, ob 🤗 Transformers richtig installiert wurde, indem Sie den folgenden Befehl ausführen:
100
+
101
+
102
+ ```bash
103
+ python -c "from transformers import pipeline; print(pipeline('sentiment-analysis')('I love you'))"
104
+ ```
105
+
106
+ ## Editierbare Installation
107
+
108
+ Sie benötigen eine bearbeitbare Installation, wenn Sie:
109
+
110
+ * die "Haupt"-Version des Quellcodes verwenden möchten.
111
+ * Zu 🤗 Transformers beitragen und Änderungen am Code testen wollen.
112
+
113
+ Klonen Sie das Repository und installieren 🤗 Transformers mit den folgenden Befehlen:
114
+
115
+ ```bash
116
+ git clone https://github.com/huggingface/transformers.git
117
+ cd transformers
118
+ pip install -e .
119
+ ```
120
+
121
+ Diese Befehle verknüpfen den Ordner, in den Sie das Repository geklont haben, mit den Pfaden Ihrer Python-Bibliotheken. Python wird nun in dem Ordner suchen, in den Sie geklont haben, zusätzlich zu den normalen Bibliothekspfaden. Wenn zum Beispiel Ihre Python-Pakete normalerweise in `~/anaconda3/envs/main/lib/python3.7/site-packages/` installiert sind, wird Python auch den Ordner durchsuchen, in den Sie geklont haben: `~/transformers/`.
122
+
123
+
124
+ <Tip warning={true}>
125
+
126
+ Sie müssen den Ordner `transformers` behalten, wenn Sie die Bibliothek weiter verwenden wollen.
127
+
128
+ </Tip>
129
+
130
+ Jetzt können Sie Ihren Klon mit dem folgenden Befehl ganz einfach auf die neueste Version von 🤗 Transformers aktualisieren:
131
+
132
+
133
+ ```bash
134
+ cd ~/transformers/
135
+ git pull
136
+ ```
137
+
138
+ Ihre Python-Umgebung wird beim nächsten Ausführen die `main`-Version von 🤗 Transformers finden.
139
+
140
+ ## Installation mit conda
141
+
142
+ Installation von dem conda Kanal `conda-forge`:
143
+
144
+ ```bash
145
+ conda install conda-forge::transformers
146
+ ```
147
+
148
+ ## Cache Einrichtung
149
+
150
+ Vorgefertigte Modelle werden heruntergeladen und lokal zwischengespeichert unter: `~/.cache/huggingface/hub`. Dies ist das Standardverzeichnis, das durch die Shell-Umgebungsvariable "TRANSFORMERS_CACHE" vorgegeben ist. Unter Windows wird das Standardverzeichnis durch `C:\Benutzer\Benutzername\.cache\huggingface\hub` angegeben. Sie können die unten aufgeführten Shell-Umgebungsvariablen - in der Reihenfolge ihrer Priorität - ändern, um ein anderes Cache-Verzeichnis anzugeben:
151
+
152
+ 1. Shell-Umgebungsvariable (Standard): `HUGGINGFACE_HUB_CACHE` oder `TRANSFORMERS_CACHE`.
153
+ 2. Shell-Umgebungsvariable: `HF_HOME`.
154
+ 3. Shell-Umgebungsvariable: `XDG_CACHE_HOME` + `/huggingface`.
155
+
156
+
157
+ <Tip>
158
+
159
+ Transformers verwendet die Shell-Umgebungsvariablen `PYTORCH_TRANSFORMERS_CACHE` oder `PYTORCH_PRETRAINED_BERT_CACHE`, wenn Sie von einer früheren Iteration dieser Bibliothek kommen und diese Umgebungsvariablen gesetzt haben, sofern Sie nicht die Shell-Umgebungsvariable `TRANSFORMERS_CACHE` angeben.
160
+
161
+ </Tip>
162
+
163
+ ## Offline Modus
164
+
165
+ Transformers ist in der Lage, in einer Firewall- oder Offline-Umgebung zu laufen, indem es nur lokale Dateien verwendet. Setzen Sie die Umgebungsvariable `TRANSFORMERS_OFFLINE=1`, um dieses Verhalten zu aktivieren.
166
+
167
+ <Tip>
168
+
169
+ Fügen sie [🤗 Datasets](https://huggingface.co/docs/datasets/) zu Ihrem Offline-Trainingsworkflow hinzufügen, indem Sie die Umgebungsvariable `HF_DATASETS_OFFLINE=1` setzen.
170
+
171
+ </Tip>
172
+
173
+ So würden Sie beispielsweise ein Programm in einem normalen Netzwerk mit einer Firewall für externe Instanzen mit dem folgenden Befehl ausführen:
174
+
175
+ ```bash
176
+ python examples/pytorch/translation/run_translation.py --model_name_or_path google-t5/t5-small --dataset_name wmt16 --dataset_config ro-en ...
177
+ ```
178
+
179
+ Führen Sie das gleiche Programm in einer Offline-Instanz mit aus:
180
+
181
+ ```bash
182
+ HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
183
+ python examples/pytorch/translation/run_translation.py --model_name_or_path google-t5/t5-small --dataset_name wmt16 --dataset_config ro-en ...
184
+ ```
185
+
186
+ Das Skript sollte nun laufen, ohne sich aufzuhängen oder eine Zeitüberschreitung abzuwarten, da es weiß, dass es nur nach lokalen Dateien suchen soll.
187
+
188
+
189
+ ### Abrufen von Modellen und Tokenizern zur Offline-Verwendung
190
+
191
+ Eine andere Möglichkeit, 🤗 Transformers offline zu verwenden, besteht darin, die Dateien im Voraus herunterzuladen und dann auf ihren lokalen Pfad zu verweisen, wenn Sie sie offline verwenden müssen. Es gibt drei Möglichkeiten, dies zu tun:
192
+
193
+ * Laden Sie eine Datei über die Benutzeroberfläche des [Model Hub](https://huggingface.co/models) herunter, indem Sie auf das ↓-Symbol klicken.
194
+
195
+ ![download-icon](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/download-icon.png)
196
+
197
+ * Verwenden Sie den [PreTrainedModel.from_pretrained] und [PreTrainedModel.save_pretrained] Workflow:
198
+
199
+ 1. Laden Sie Ihre Dateien im Voraus mit [`PreTrainedModel.from_pretrained`] herunter:
200
+
201
+ ```py
202
+ >>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
203
+
204
+ >>> tokenizer = AutoTokenizer.from_pretrained("bigscience/T0_3B")
205
+ >>> model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/T0_3B")
206
+ ```
207
+
208
+ 2. Speichern Sie Ihre Dateien in einem bestimmten Verzeichnis mit [`PreTrainedModel.save_pretrained`]:
209
+
210
+ ```py
211
+ >>> tokenizer.save_pretrained("./your/path/bigscience_t0")
212
+ >>> model.save_pretrained("./your/path/bigscience_t0")
213
+ ```
214
+
215
+ 3. Wenn Sie nun offline sind, laden Sie Ihre Dateien mit [`PreTrainedModel.from_pretrained`] aus dem bestimmten Verzeichnis:
216
+
217
+ ```py
218
+ >>> tokenizer = AutoTokenizer.from_pretrained("./your/path/bigscience_t0")
219
+ >>> model = AutoModel.from_pretrained("./your/path/bigscience_t0")
220
+ ```
221
+
222
+ * Programmatisches Herunterladen von Dateien mit der [huggingface_hub](https://github.com/huggingface/huggingface_hub/tree/main/src/huggingface_hub) Bibliothek:
223
+
224
+ 1. Installieren Sie die "huggingface_hub"-Bibliothek in Ihrer virtuellen Umgebung:
225
+
226
+ ```bash
227
+ python -m pip install huggingface_hub
228
+ ```
229
+
230
+ 2. Verwenden Sie die Funktion [`hf_hub_download`](https://huggingface.co/docs/hub/adding-a-library#download-files-from-the-hub), um eine Datei in einen bestimmten Pfad herunterzuladen. Der folgende Befehl lädt zum Beispiel die Datei "config.json" aus dem Modell [T0](https://huggingface.co/bigscience/T0_3B) in den gewünschten Pfad herunter:
231
+
232
+ ```py
233
+ >>> from huggingface_hub import hf_hub_download
234
+
235
+ >>> hf_hub_download(repo_id="bigscience/T0_3B", filename="config.json", cache_dir="./your/path/bigscience_t0")
236
+ ```
237
+
238
+ Sobald Ihre Datei heruntergeladen und lokal zwischengespeichert ist, geben Sie den lokalen Pfad an, um sie zu laden und zu verwenden:
239
+
240
+ ```py
241
+ >>> from transformers import AutoConfig
242
+
243
+ >>> config = AutoConfig.from_pretrained("./your/path/bigscience_t0/config.json")
244
+ ```
245
+
246
+ <Tip>
247
+
248
+ Weitere Informationen zum Herunterladen von Dateien, die auf dem Hub gespeichert sind, finden Sie im Abschnitt [Wie man Dateien vom Hub herunterlädt](https://huggingface.co/docs/hub/how-to-downstream).
249
+
250
+ </Tip>
docs/source/de/llm_tutorial.md ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2023 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+
18
+ # Generation with LLMs
19
+
20
+ [[open-in-colab]]
21
+
22
+ LLMs (Large Language Models) sind die Schlüsselkomponente bei der Texterstellung. Kurz gesagt, bestehen sie aus großen, vortrainierten Transformationsmodellen, die darauf trainiert sind, das nächste Wort (oder genauer gesagt Token) aus einem Eingabetext vorherzusagen. Da sie jeweils ein Token vorhersagen, müssen Sie etwas Aufwändigeres tun, um neue Sätze zu generieren, als nur das Modell aufzurufen - Sie müssen eine autoregressive Generierung durchführen.
23
+
24
+ Die autoregressive Generierung ist ein Verfahren zur Inferenzzeit, bei dem ein Modell mit seinen eigenen generierten Ausgaben iterativ aufgerufen wird, wenn einige anfängliche Eingaben vorliegen. In 🤗 Transformers wird dies von der Methode [`~generation.GenerationMixin.generate`] übernommen, die allen Modellen mit generativen Fähigkeiten zur Verfügung steht.
25
+
26
+ Dieses Tutorial zeigt Ihnen, wie Sie:
27
+
28
+ * Text mit einem LLM generieren
29
+ * Vermeiden Sie häufige Fallstricke
30
+ * Nächste Schritte, damit Sie das Beste aus Ihrem LLM herausholen können
31
+
32
+ Bevor Sie beginnen, stellen Sie sicher, dass Sie alle erforderlichen Bibliotheken installiert haben:
33
+
34
+ ```bash
35
+ pip install transformers bitsandbytes>=0.39.0 -q
36
+ ```
37
+
38
+
39
+ ## Text generieren
40
+
41
+ Ein Sprachmodell, das für [causal language modeling](tasks/language_modeling) trainiert wurde, nimmt eine Folge von Text-Token als Eingabe und gibt die Wahrscheinlichkeitsverteilung für das nächste Token zurück.
42
+
43
+ <!-- [GIF 1 -- FWD PASS] -->
44
+ <figure class="image table text-center m-0 w-full">
45
+ <video
46
+ style="max-width: 90%; margin: auto;"
47
+ autoplay loop muted playsinline
48
+ src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/assisted-generation/gif_1_1080p.mov"
49
+ ></video>
50
+ <figcaption>"Forward pass of an LLM"</figcaption>
51
+ </figure>
52
+
53
+ Ein wichtiger Aspekt der autoregressiven Generierung mit LLMs ist die Auswahl des nächsten Tokens aus dieser Wahrscheinlichkeitsverteilung. In diesem Schritt ist alles möglich, solange Sie am Ende ein Token für die nächste Iteration haben. Das heißt, es kann so einfach sein wie die Auswahl des wahrscheinlichsten Tokens aus der Wahrscheinlichkeitsverteilung oder so komplex wie die Anwendung von einem Dutzend Transformationen vor der Stichprobenziehung aus der resultierenden Verteilung.
54
+
55
+ <!-- [GIF 2 -- TEXT GENERATION] -->
56
+ <figure class="image table text-center m-0 w-full">
57
+ <video
58
+ style="max-width: 90%; margin: auto;"
59
+ autoplay loop muted playsinline
60
+ src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/assisted-generation/gif_2_1080p.mov"
61
+ ></video>
62
+ <figcaption>"Die autoregressive Generierung wählt iterativ das nächste Token aus einer Wahrscheinlichkeitsverteilung aus, um Text zu erzeugen"</figcaption>
63
+ </figure>
64
+
65
+ Der oben dargestellte Prozess wird iterativ wiederholt, bis eine bestimmte Abbruchbedingung erreicht ist. Im Idealfall wird die Abbruchbedingung vom Modell vorgegeben, das lernen sollte, wann es ein Ende-der-Sequenz-Token (EOS) ausgeben muss. Ist dies nicht der Fall, stoppt die Generierung, wenn eine vordefinierte Maximallänge erreicht ist.
66
+
67
+ Damit sich Ihr Modell so verhält, wie Sie es für Ihre Aufgabe erwarten, müssen Sie den Schritt der Token-Auswahl und die Abbruchbedingung richtig einstellen. Aus diesem Grund haben wir zu jedem Modell eine [`~generation.GenerationConfig`]-Datei, die eine gute generative Standardparametrisierung enthält und zusammen mit Ihrem Modell geladen wird.
68
+
69
+ Lassen Sie uns über Code sprechen!
70
+
71
+ <Tip>
72
+
73
+ Wenn Sie an der grundlegenden Verwendung von LLMs interessiert sind, ist unsere High-Level-Schnittstelle [`Pipeline`](pipeline_tutorial) ein guter Ausgangspunkt. LLMs erfordern jedoch oft fortgeschrittene Funktionen wie Quantisierung und Feinsteuerung des Token-Auswahlschritts, was am besten über [`~generation.GenerationMixin.generate`] erfolgt. Die autoregressive Generierung mit LLMs ist ebenfalls ressourcenintensiv und sollte für einen angemessenen Durchsatz auf einer GPU ausgeführt werden.
74
+
75
+ </Tip>
76
+
77
+ <!-- TODO: update example to llama 2 (or a newer popular baseline) when it becomes ungated -->
78
+ Zunächst müssen Sie das Modell laden.
79
+
80
+ ```py
81
+ >>> from transformers import AutoModelForCausalLM
82
+
83
+ >>> model = AutoModelForCausalLM.from_pretrained(
84
+ ... "openlm-research/open_llama_7b", device_map="auto", load_in_4bit=True
85
+ ... )
86
+ ```
87
+
88
+ Sie werden zwei Flags in dem Aufruf `from_pretrained` bemerken:
89
+
90
+ - `device_map` stellt sicher, dass das Modell auf Ihre GPU(s) übertragen wird
91
+ - `load_in_4bit` wendet [dynamische 4-Bit-Quantisierung](main_classes/quantization) an, um die Ressourcenanforderungen massiv zu reduzieren
92
+
93
+ Es gibt noch andere Möglichkeiten, ein Modell zu initialisieren, aber dies ist eine gute Grundlage, um mit einem LLM zu beginnen.
94
+
95
+ Als nächstes müssen Sie Ihre Texteingabe mit einem [tokenizer](tokenizer_summary) vorverarbeiten.
96
+
97
+ ```py
98
+ >>> from transformers import AutoTokenizer
99
+
100
+ >>> tokenizer = AutoTokenizer.from_pretrained("openlm-research/open_llama_7b")
101
+ >>> model_inputs = tokenizer(["A list of colors: red, blue"], return_tensors="pt").to("cuda")
102
+ ```
103
+
104
+ Die Variable `model_inputs` enthält die tokenisierte Texteingabe sowie die Aufmerksamkeitsmaske. Obwohl [`~generation.GenerationMixin.generate`] sein Bestes tut, um die Aufmerksamkeitsmaske abzuleiten, wenn sie nicht übergeben wird, empfehlen wir, sie für optimale Ergebnisse wann immer möglich zu übergeben.
105
+
106
+ Rufen Sie schließlich die Methode [`~generation.GenerationMixin.generate`] auf, um die generierten Token zurückzugeben, die vor dem Drucken in Text umgewandelt werden sollten.
107
+
108
+ ```py
109
+ >>> generated_ids = model.generate(**model_inputs)
110
+ >>> tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
111
+ 'A list of colors: red, blue, green, yellow, black, white, and brown'
112
+ ```
113
+
114
+ Und das war's! Mit ein paar Zeilen Code können Sie sich die Macht eines LLM zunutze machen.
115
+
116
+
117
+ ## Häufige Fallstricke
118
+
119
+ Es gibt viele [Generierungsstrategien](generation_strategies), und manchmal sind die Standardwerte für Ihren Anwendungsfall vielleicht nicht geeignet. Wenn Ihre Ausgaben nicht mit dem übereinstimmen, was Sie erwarten, haben wir eine Liste der häufigsten Fallstricke erstellt und wie Sie diese vermeiden können.
120
+
121
+ ```py
122
+ >>> from transformers import AutoModelForCausalLM, AutoTokenizer
123
+
124
+ >>> tokenizer = AutoTokenizer.from_pretrained("openlm-research/open_llama_7b")
125
+ >>> tokenizer.pad_token = tokenizer.eos_token # Llama has no pad token by default
126
+ >>> model = AutoModelForCausalLM.from_pretrained(
127
+ ... "openlm-research/open_llama_7b", device_map="auto", load_in_4bit=True
128
+ ... )
129
+ ```
130
+
131
+ ### Generierte Ausgabe ist zu kurz/lang
132
+
133
+ Wenn in der Datei [`~generation.GenerationConfig`] nichts angegeben ist, gibt `generate` standardmäßig bis zu 20 Token zurück. Wir empfehlen dringend, `max_new_tokens` in Ihrem `generate`-Aufruf manuell zu setzen, um die maximale Anzahl neuer Token zu kontrollieren, die zurückgegeben werden können. Beachten Sie, dass LLMs (genauer gesagt, [decoder-only models](https://huggingface.co/learn/nlp-course/chapter1/6?fw=pt)) auch die Eingabeaufforderung als Teil der Ausgabe zurückgeben.
134
+
135
+
136
+ ```py
137
+ >>> model_inputs = tokenizer(["A sequence of numbers: 1, 2"], return_tensors="pt").to("cuda")
138
+
139
+ >>> # By default, the output will contain up to 20 tokens
140
+ >>> generated_ids = model.generate(**model_inputs)
141
+ >>> tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
142
+ 'A sequence of numbers: 1, 2, 3, 4, 5'
143
+
144
+ >>> # Setting `max_new_tokens` allows you to control the maximum length
145
+ >>> generated_ids = model.generate(**model_inputs, max_new_tokens=50)
146
+ >>> tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
147
+ 'A sequence of numbers: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,'
148
+ ```
149
+
150
+ ### Falscher Generierungsmodus
151
+
152
+ Standardmäßig und sofern nicht in der Datei [`~generation.GenerationConfig`] angegeben, wählt `generate` bei jeder Iteration das wahrscheinlichste Token aus (gierige Dekodierung). Je nach Aufgabe kann dies unerwünscht sein; kreative Aufgaben wie Chatbots oder das Schreiben eines Aufsatzes profitieren vom Sampling. Andererseits profitieren Aufgaben, bei denen es auf die Eingabe ankommt, wie z.B. Audiotranskription oder Übersetzung, von der gierigen Dekodierung. Aktivieren Sie das Sampling mit `do_sample=True`. Mehr zu diesem Thema erfahren Sie in diesem [Blogbeitrag](https://huggingface.co/blog/how-to-generate).
153
+
154
+ ```py
155
+ >>> # Set seed or reproducibility -- you don't need this unless you want full reproducibility
156
+ >>> from transformers import set_seed
157
+ >>> set_seed(0)
158
+
159
+ >>> model_inputs = tokenizer(["I am a cat."], return_tensors="pt").to("cuda")
160
+
161
+ >>> # LLM + greedy decoding = repetitive, boring output
162
+ >>> generated_ids = model.generate(**model_inputs)
163
+ >>> tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
164
+ 'I am a cat. I am a cat. I am a cat. I am a cat'
165
+
166
+ >>> # With sampling, the output becomes more creative!
167
+ >>> generated_ids = model.generate(**model_inputs, do_sample=True)
168
+ >>> tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
169
+ 'I am a cat.\nI just need to be. I am always.\nEvery time'
170
+ ```
171
+
172
+ ### Falsche Auffüllseite
173
+
174
+ LLMs sind [decoder-only](https://huggingface.co/learn/nlp-course/chapter1/6?fw=pt)-Architekturen, d.h. sie iterieren weiter über Ihre Eingabeaufforderung. Wenn Ihre Eingaben nicht die gleiche Länge haben, müssen sie aufgefüllt werden. Da LLMs nicht darauf trainiert sind, mit aufgefüllten Token fortzufahren, muss Ihre Eingabe links aufgefüllt werden. Vergessen Sie auch nicht, die Aufmerksamkeitsmaske an generate zu übergeben!
175
+
176
+ ```py
177
+ >>> # The tokenizer initialized above has right-padding active by default: the 1st sequence,
178
+ >>> # which is shorter, has padding on the right side. Generation fails.
179
+ >>> model_inputs = tokenizer(
180
+ ... ["1, 2, 3", "A, B, C, D, E"], padding=True, return_tensors="pt"
181
+ ... ).to("cuda")
182
+ >>> generated_ids = model.generate(**model_inputs)
183
+ >>> tokenizer.batch_decode(generated_ids[0], skip_special_tokens=True)[0]
184
+ ''
185
+
186
+ >>> # With left-padding, it works as expected!
187
+ >>> tokenizer = AutoTokenizer.from_pretrained("openlm-research/open_llama_7b", padding_side="left")
188
+ >>> tokenizer.pad_token = tokenizer.eos_token # Llama has no pad token by default
189
+ >>> model_inputs = tokenizer(
190
+ ... ["1, 2, 3", "A, B, C, D, E"], padding=True, return_tensors="pt"
191
+ ... ).to("cuda")
192
+ >>> generated_ids = model.generate(**model_inputs)
193
+ >>> tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
194
+ '1, 2, 3, 4, 5, 6,'
195
+ ```
196
+
197
+ <!-- TODO: when the prompting guide is ready, mention the importance of setting the right prompt in this section -->
198
+
199
+ ## Weitere Ressourcen
200
+
201
+ Während der Prozess der autoregressiven Generierung relativ einfach ist, kann die optimale Nutzung Ihres LLM ein schwieriges Unterfangen sein, da es viele bewegliche Teile gibt. Für Ihre nächsten Schritte, die Ihnen helfen, tiefer in die LLM-Nutzung und das Verständnis einzutauchen:
202
+
203
+ <!-- TODO: mit neuen Anleitungen vervollständigen -->
204
+ ### Fortgeschrittene Nutzung generieren
205
+
206
+ 1. [Leitfaden](generation_strategies) zur Steuerung verschiedener Generierungsmethoden, zur Einrichtung der Generierungskonfigurationsdatei und zum Streaming der Ausgabe;
207
+ 2. API-Referenz zu [`~generation.GenerationConfig`], [`~generation.GenerationMixin.generate`] und [generate-bezogene Klassen](internal/generation_utils).
208
+
209
+ ### LLM-Ranglisten
210
+
211
+ 1. [Open LLM Leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard), das sich auf die Qualität der Open-Source-Modelle konzentriert;
212
+ 2. [Open LLM-Perf Leaderboard](https://huggingface.co/spaces/optimum/llm-perf-leaderboard), das sich auf den LLM-Durchsatz konzentriert.
213
+
214
+ ### Latenz und Durchsatz
215
+
216
+ 1. [Leitfaden](main_classes/quantization) zur dynamischen Quantisierung, der Ihnen zeigt, wie Sie Ihren Speicherbedarf drastisch reduzieren können.
217
+
218
+ ### Verwandte Bibliotheken
219
+
220
+ 1. [text-generation-inference](https://github.com/huggingface/text-generation-inference), ein produktionsreifer Server für LLMs;
221
+ 2. [`optimum`](https://github.com/huggingface/optimum), eine Erweiterung von 🤗 Transformers, die für bestimmte Hardware-Geräte optimiert.
docs/source/de/model_sharing.md ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Ein Modell teilen
18
+
19
+ Die letzten beiden Tutorials haben gezeigt, wie man ein Modell mit PyTorch, Keras und 🤗 Accelerate für verteilte Setups feinabstimmen kann. Der nächste Schritt besteht darin, Ihr Modell mit der Community zu teilen! Bei Hugging Face glauben wir an den offenen Austausch von Wissen und Ressourcen, um künstliche Intelligenz für alle zu demokratisieren. Wir ermutigen Sie, Ihr Modell mit der Community zu teilen, um anderen zu helfen, Zeit und Ressourcen zu sparen.
20
+
21
+ In diesem Tutorial lernen Sie zwei Methoden kennen, wie Sie ein trainiertes oder verfeinertes Modell auf dem [Model Hub](https://huggingface.co/models) teilen können:
22
+
23
+ - Programmgesteuertes Übertragen Ihrer Dateien auf den Hub.
24
+ - Ziehen Sie Ihre Dateien per Drag-and-Drop über die Weboberfläche in den Hub.
25
+
26
+ <iframe width="560" height="315" src="https://www.youtube.com/embed/XvSGPZFEjDY" title="YouTube video player"
27
+ frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope;
28
+ picture-in-picture" allowfullscreen></iframe>
29
+
30
+ <Tip>
31
+
32
+ Um ein Modell mit der Öffentlichkeit zu teilen, benötigen Sie ein Konto auf [huggingface.co](https://huggingface.co/join). Sie können auch einer bestehenden Organisation beitreten oder eine neue Organisation gründen.
33
+
34
+ </Tip>
35
+
36
+ ## Repository-Funktionen
37
+
38
+ Jedes Repository im Model Hub verhält sich wie ein typisches GitHub-Repository. Unsere Repositorys bieten Versionierung, Commit-Historie und die Möglichkeit, Unterschiede zu visualisieren.
39
+
40
+ Die integrierte Versionierung des Model Hub basiert auf Git und [git-lfs](https://git-lfs.github.com/). Mit anderen Worten: Sie können ein Modell als ein Repository behandeln, was eine bessere Zugriffskontrolle und Skalierbarkeit ermöglicht. Die Versionskontrolle ermöglicht *Revisionen*, eine Methode zum Anheften einer bestimmten Version eines Modells mit einem Commit-Hash, Tag oder Branch.
41
+
42
+ Folglich können Sie eine bestimmte Modellversion mit dem Parameter "Revision" laden:
43
+
44
+ ```py
45
+ >>> model = AutoModel.from_pretrained(
46
+ ... "julien-c/EsperBERTo-small", revision="v2.0.1" # tag name, or branch name, or commit hash
47
+ ... )
48
+ ```
49
+
50
+ Dateien lassen sich auch in einem Repository leicht bearbeiten, und Sie können die Commit-Historie sowie die Unterschiede einsehen:
51
+
52
+ ![vis_diff](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/vis_diff.png)
53
+
54
+ ## Einrichtung
55
+
56
+ Bevor Sie ein Modell für den Hub freigeben, benötigen Sie Ihre Hugging Face-Anmeldedaten. Wenn Sie Zugang zu einem Terminal haben, führen Sie den folgenden Befehl in der virtuellen Umgebung aus, in der 🤗 Transformers installiert ist. Dadurch werden Ihre Zugangsdaten in Ihrem Hugging Face-Cache-Ordner (standardmäßig `~/.cache/`) gespeichert:
57
+
58
+ ```bash
59
+ huggingface-cli login
60
+ ```
61
+
62
+ Wenn Sie ein Notebook wie Jupyter oder Colaboratory verwenden, stellen Sie sicher, dass Sie die [`huggingface_hub`](https://huggingface.co/docs/hub/adding-a-library) Bibliothek installiert haben. Diese Bibliothek ermöglicht Ihnen die programmatische Interaktion mit dem Hub.
63
+
64
+ ```bash
65
+ pip install huggingface_hub
66
+ ```
67
+
68
+ Verwenden Sie dann `notebook_login`, um sich beim Hub anzumelden, und folgen Sie dem Link [hier](https://huggingface.co/settings/token), um ein Token für die Anmeldung zu generieren:
69
+
70
+ ```py
71
+ >>> from huggingface_hub import notebook_login
72
+
73
+ >>> notebook_login()
74
+ ```
75
+
76
+ ## Ein Modell für alle Frameworks konvertieren
77
+
78
+ Um sicherzustellen, dass Ihr Modell von jemandem verwendet werden kann, der mit einem anderen Framework arbeitet, empfehlen wir Ihnen, Ihr Modell sowohl mit PyTorch- als auch mit TensorFlow-Checkpoints zu konvertieren und hochzuladen. Während Benutzer immer noch in der Lage sind, Ihr Modell von einem anderen Framework zu laden, wenn Sie diesen Schritt überspringen, wird es langsamer sein, weil 🤗 Transformers den Checkpoint on-the-fly konvertieren müssen.
79
+
80
+ Die Konvertierung eines Checkpoints für ein anderes Framework ist einfach. Stellen Sie sicher, dass Sie PyTorch und TensorFlow installiert haben (siehe [hier](installation) für Installationsanweisungen), und finden Sie dann das spezifische Modell für Ihre Aufgabe in dem anderen Framework.
81
+
82
+ <frameworkcontent>
83
+ <pt>
84
+ Geben Sie `from_tf=True` an, um einen Prüfpunkt von TensorFlow nach PyTorch zu konvertieren:
85
+
86
+ ```py
87
+ >>> pt_model = DistilBertForSequenceClassification.from_pretrained("path/to/awesome-name-you-picked", from_tf=True)
88
+ >>> pt_model.save_pretrained("path/to/awesome-name-you-picked")
89
+ ```
90
+ </pt>
91
+ <tf>
92
+ Geben Sie `from_pt=True` an, um einen Prüfpunkt von PyTorch nach TensorFlow zu konvertieren:
93
+
94
+ ```py
95
+ >>> tf_model = TFDistilBertForSequenceClassification.from_pretrained("path/to/awesome-name-you-picked", from_pt=True)
96
+ ```
97
+
98
+ Dann können Sie Ihr neues TensorFlow-Modell mit seinem neuen Checkpoint speichern:
99
+
100
+ ```py
101
+ >>> tf_model.save_pretrained("path/to/awesome-name-you-picked")
102
+ ```
103
+ </tf>
104
+ <jax>
105
+ Wenn ein Modell in Flax verfügbar ist, können Sie auch einen Kontrollpunkt von PyTorch nach Flax konvertieren:
106
+
107
+ ```py
108
+ >>> flax_model = FlaxDistilBertForSequenceClassification.from_pretrained(
109
+ ... "path/to/awesome-name-you-picked", from_pt=True
110
+ ... )
111
+ ```
112
+ </jax>
113
+ </frameworkcontent>
114
+
115
+ ## Ein Modell während des Trainings hochladen
116
+
117
+ <frameworkcontent>
118
+ <pt>
119
+ <Youtube id="Z1-XMy-GNLQ"/>
120
+
121
+ Die Weitergabe eines Modells an den Hub ist so einfach wie das Hinzufügen eines zusätzlichen Parameters oder Rückrufs. Erinnern Sie sich an das [Feinabstimmungs-Tutorial](training), in der Klasse [`TrainingArguments`] geben Sie Hyperparameter und zusätzliche Trainingsoptionen an. Eine dieser Trainingsoptionen beinhaltet die Möglichkeit, ein Modell direkt an den Hub zu pushen. Setzen Sie `push_to_hub=True` in Ihrer [`TrainingArguments`]:
122
+
123
+ ```py
124
+ >>> training_args = TrainingArguments(output_dir="my-awesome-model", push_to_hub=True)
125
+ ```
126
+
127
+ Übergeben Sie Ihre Trainingsargumente wie gewohnt an [`Trainer`]:
128
+
129
+ ```py
130
+ >>> trainer = Trainer(
131
+ ... model=model,
132
+ ... args=training_args,
133
+ ... train_dataset=small_train_dataset,
134
+ ... eval_dataset=small_eval_dataset,
135
+ ... compute_metrics=compute_metrics,
136
+ ... )
137
+ ```
138
+
139
+ Nach der Feinabstimmung Ihres Modells rufen Sie [`~transformers.Trainer.push_to_hub`] auf [`Trainer`] auf, um das trainierte Modell an den Hub zu übertragen. Transformers fügt sogar automatisch Trainings-Hyperparameter, Trainingsergebnisse und Framework-Versionen zu Ihrer Modellkarte hinzu!
140
+
141
+ ```py
142
+ >>> trainer.push_to_hub()
143
+ ```
144
+ </pt>
145
+ <tf>
146
+ Geben Sie ein Modell mit [`PushToHubCallback`] an den Hub weiter. In der [`PushToHubCallback`] Funktion, fügen Sie hinzu:
147
+
148
+ - Ein Ausgabeverzeichnis für Ihr Modell.
149
+ - Einen Tokenizer.
150
+ - Die `hub_model_id`, die Ihr Hub-Benutzername und Modellname ist.
151
+
152
+ ```py
153
+ >>> from transformers import PushToHubCallback
154
+
155
+ >>> push_to_hub_callback = PushToHubCallback(
156
+ ... output_dir="./your_model_save_path", tokenizer=tokenizer, hub_model_id="your-username/my-awesome-model"
157
+ ... )
158
+ ```
159
+
160
+ Fügen Sie den Callback zu [`fit`](https://keras.io/api/models/model_training_apis/) hinzu, und 🤗 Transformers wird das trainierte Modell an den Hub weiterleiten:
161
+
162
+ ```py
163
+ >>> model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3, callbacks=push_to_hub_callback)
164
+ ```
165
+ </tf>
166
+ </frameworkcontent>
167
+
168
+ ## Verwenden Sie die Funktion `push_to_hub`.
169
+
170
+ Sie können `push_to_hub` auch direkt für Ihr Modell aufrufen, um es in den Hub hochzuladen.
171
+
172
+ Geben Sie den Namen Ihres Modells in "push_to_hub" an:
173
+
174
+ ```py
175
+ >>> pt_model.push_to_hub("my-awesome-model")
176
+ ```
177
+
178
+ Dadurch wird ein Repository unter Ihrem Benutzernamen mit dem Modellnamen `my-awesome-model` erstellt. Benutzer können nun Ihr Modell mit der Funktion `from_pretrained` laden:
179
+
180
+ ```py
181
+ >>> from transformers import AutoModel
182
+
183
+ >>> model = AutoModel.from_pretrained("your_username/my-awesome-model")
184
+ ```
185
+
186
+ Wenn Sie zu einer Organisation gehören und Ihr Modell stattdessen unter dem Namen der Organisation pushen wollen, fügen Sie diesen einfach zur `repo_id` hinzu:
187
+
188
+ ```py
189
+ >>> pt_model.push_to_hub("my-awesome-org/my-awesome-model")
190
+ ```
191
+
192
+ Die Funktion "push_to_hub" kann auch verwendet werden, um andere Dateien zu einem Modell-Repository hinzuzufügen. Zum Beispiel kann man einen Tokenizer zu einem Modell-Repository hinzufügen:
193
+
194
+ ```py
195
+ >>> tokenizer.push_to_hub("my-awesome-model")
196
+ ```
197
+
198
+ Oder vielleicht möchten Sie die TensorFlow-Version Ihres fein abgestimmten PyTorch-Modells hinzufügen:
199
+
200
+ ```py
201
+ >>> tf_model.push_to_hub("my-awesome-model")
202
+ ```
203
+
204
+ Wenn Sie nun zu Ihrem Hugging Face-Profil navigieren, sollten Sie Ihr neu erstelltes Modell-Repository sehen. Wenn Sie auf die Registerkarte **Dateien** klicken, werden alle Dateien angezeigt, die Sie in das Repository hochgeladen haben.
205
+
206
+ Weitere Einzelheiten zum Erstellen und Hochladen von Dateien in ein Repository finden Sie in der Hub-Dokumentation [hier](https://huggingface.co/docs/hub/how-to-upstream).
207
+
208
+ ## Hochladen mit der Weboberfläche
209
+
210
+ Benutzer, die einen no-code Ansatz bevorzugen, können ein Modell über das Webinterface des Hubs hochladen. Besuchen Sie [huggingface.co/new](https://huggingface.co/new) um ein neues Repository zu erstellen:
211
+
212
+ ![new_model_repo](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/new_model_repo.png)
213
+
214
+ Fügen Sie von hier aus einige Informationen über Ihr Modell hinzu:
215
+
216
+ - Wählen Sie den **Besitzer** des Repositorys. Dies können Sie selbst oder eine der Organisationen sein, denen Sie angehören.
217
+ - Wählen Sie einen Namen für Ihr Modell, der auch der Name des Repositorys sein wird.
218
+ - Wählen Sie, ob Ihr Modell öffentlich oder privat ist.
219
+ - Geben Sie die Lizenzverwendung für Ihr Modell an.
220
+
221
+ Klicken Sie nun auf die Registerkarte **Dateien** und klicken Sie auf die Schaltfläche **Datei hinzufügen**, um eine neue Datei in Ihr Repository hochzuladen. Ziehen Sie dann eine Datei per Drag-and-Drop hoch und fügen Sie eine Übergabemeldung hinzu.
222
+
223
+ ![upload_file](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/upload_file.png)
224
+
225
+ ## Hinzufügen einer Modellkarte
226
+
227
+ Um sicherzustellen, dass die Benutzer die Fähigkeiten, Grenzen, möglichen Verzerrungen und ethischen Aspekte Ihres Modells verstehen, fügen Sie bitte eine Modellkarte zu Ihrem Repository hinzu. Die Modellkarte wird in der Datei `README.md` definiert. Sie können eine Modellkarte hinzufügen, indem Sie:
228
+
229
+ * Manuelles Erstellen und Hochladen einer "README.md"-Datei.
230
+ * Klicken Sie auf die Schaltfläche **Modellkarte bearbeiten** in Ihrem Modell-Repository.
231
+
232
+ Werfen Sie einen Blick auf die DistilBert [model card](https://huggingface.co/distilbert/distilbert-base-uncased) als gutes Beispiel für die Art von Informationen, die eine Modellkarte enthalten sollte. Weitere Details über andere Optionen, die Sie in der Datei "README.md" einstellen können, wie z.B. den Kohlenstoff-Fußabdruck eines Modells oder Beispiele für Widgets, finden Sie in der Dokumentation [hier](https://huggingface.co/docs/hub/models-cards).
docs/source/de/peft.md ADDED
@@ -0,0 +1,216 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2023 The HuggingFace Team. All rights reserved.
2
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
3
+ the License. You may obtain a copy of the License at
4
+ http://www.apache.org/licenses/LICENSE-2.0
5
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
6
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
7
+ specific language governing permissions and limitations under the License.
8
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
9
+ rendered properly in your Markdown viewer.
10
+ -->
11
+
12
+ # Adapter mit 🤗 PEFT laden
13
+
14
+ [[open-in-colab]]
15
+
16
+ Die [Parameter-Efficient Fine Tuning (PEFT)](https://huggingface.co/blog/peft) Methoden frieren die vorab trainierten Modellparameter während der Feinabstimmung ein und fügen eine kleine Anzahl trainierbarer Parameter (die Adapter) hinzu. Die Adapter werden trainiert, um aufgabenspezifische Informationen zu lernen. Es hat sich gezeigt, dass dieser Ansatz sehr speichereffizient ist und weniger Rechenleistung beansprucht, während die Ergebnisse mit denen eines vollständig feinabgestimmten Modells vergleichbar sind.
17
+
18
+ Adapter, die mit PEFT trainiert wurden, sind in der Regel um eine Größenordnung kleiner als das vollständige Modell, so dass sie bequem gemeinsam genutzt, gespeichert und geladen werden können.
19
+
20
+ <div class="flex flex-col justify-center">
21
+ <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/peft/PEFT-hub-screenshot.png"/>
22
+ <figcaption class="text-center">Die Adaptergewichte für ein OPTForCausalLM-Modell, die auf dem Hub gespeichert sind, sind nur ~6MB groß, verglichen mit der vollen Größe der Modellgewichte, die ~700MB betragen können.</figcaption>
23
+ </div>
24
+
25
+ Wenn Sie mehr über die 🤗 PEFT-Bibliothek erfahren möchten, sehen Sie sich die [Dokumentation](https://huggingface.co/docs/peft/index) an.
26
+
27
+ ## Setup
28
+
29
+ Starten Sie mit der Installation von 🤗 PEFT:
30
+
31
+ ```bash
32
+ pip install peft
33
+ ```
34
+
35
+ Wenn Sie die brandneuen Funktionen ausprobieren möchten, sollten Sie die Bibliothek aus dem Quellcode installieren:
36
+
37
+ ```bash
38
+ pip install git+https://github.com/huggingface/peft.git
39
+ ```
40
+
41
+ ## Unterstützte PEFT-Modelle
42
+
43
+ Transformers unterstützt nativ einige PEFT-Methoden, d.h. Sie können lokal oder auf dem Hub gespeicherte Adaptergewichte laden und sie mit wenigen Zeilen Code einfach ausführen oder trainieren. Die folgenden Methoden werden unterstützt:
44
+
45
+ - [Low Rank Adapters](https://huggingface.co/docs/peft/conceptual_guides/lora)
46
+ - [IA3](https://huggingface.co/docs/peft/conceptual_guides/ia3)
47
+ - [AdaLoRA](https://arxiv.org/abs/2303.10512)
48
+
49
+ Wenn Sie andere PEFT-Methoden, wie z.B. Prompt Learning oder Prompt Tuning, verwenden möchten, oder über die 🤗 PEFT-Bibliothek im Allgemeinen, lesen Sie bitte die [Dokumentation](https://huggingface.co/docs/peft/index).
50
+
51
+
52
+ ## Laden Sie einen PEFT-Adapter
53
+
54
+ Um ein PEFT-Adaptermodell von 🤗 Transformers zu laden und zu verwenden, stellen Sie sicher, dass das Hub-Repository oder das lokale Verzeichnis eine `adapter_config.json`-Datei und die Adaptergewichte enthält, wie im obigen Beispielbild gezeigt. Dann können Sie das PEFT-Adaptermodell mit der Klasse `AutoModelFor` laden. Um zum Beispiel ein PEFT-Adaptermodell für die kausale Sprachmodellierung zu laden:
55
+
56
+ 1. Geben Sie die PEFT-Modell-ID an.
57
+ 2. übergeben Sie es an die Klasse [`AutoModelForCausalLM`].
58
+
59
+ ```py
60
+ from transformers import AutoModelForCausalLM, AutoTokenizer
61
+
62
+ peft_model_id = "ybelkada/opt-350m-lora"
63
+ model = AutoModelForCausalLM.from_pretrained(peft_model_id)
64
+ ```
65
+
66
+ <Tip>
67
+
68
+ Sie können einen PEFT-Adapter entweder mit einer `AutoModelFor`-Klasse oder der Basismodellklasse wie `OPTForCausalLM` oder `LlamaForCausalLM` laden.
69
+
70
+ </Tip>
71
+
72
+ Sie können einen PEFT-Adapter auch laden, indem Sie die Methode `load_adapter` aufrufen:
73
+
74
+ ```py
75
+ from transformers import AutoModelForCausalLM, AutoTokenizer
76
+
77
+ model_id = "facebook/opt-350m"
78
+ peft_model_id = "ybelkada/opt-350m-lora"
79
+
80
+ model = AutoModelForCausalLM.from_pretrained(model_id)
81
+ model.load_adapter(peft_model_id)
82
+ ```
83
+
84
+ ## Laden in 8bit oder 4bit
85
+
86
+ Die `bitsandbytes`-Integration unterstützt Datentypen mit 8bit und 4bit Genauigkeit, was für das Laden großer Modelle nützlich ist, weil es Speicher spart (lesen Sie den `bitsandbytes`-Integrations [guide](./quantization#bitsandbytes-integration), um mehr zu erfahren). Fügen Sie die Parameter `load_in_8bit` oder `load_in_4bit` zu [`~PreTrainedModel.from_pretrained`] hinzu und setzen Sie `device_map="auto"`, um das Modell effektiv auf Ihre Hardware zu verteilen:
87
+
88
+ ```py
89
+ from transformers import AutoModelForCausalLM, AutoTokenizer
90
+
91
+ peft_model_id = "ybelkada/opt-350m-lora"
92
+ model = AutoModelForCausalLM.from_pretrained(peft_model_id, device_map="auto", load_in_8bit=True)
93
+ ```
94
+
95
+ ## Einen neuen Adapter hinzufügen
96
+
97
+ Sie können [`~peft.PeftModel.add_adapter`] verwenden, um einen neuen Adapter zu einem Modell mit einem bestehenden Adapter hinzuzufügen, solange der neue Adapter vom gleichen Typ ist wie der aktuelle Adapter. Wenn Sie zum Beispiel einen bestehenden LoRA-Adapter an ein Modell angehängt haben:
98
+
99
+ ```py
100
+ from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
101
+ from peft import PeftConfig
102
+
103
+ model_id = "facebook/opt-350m"
104
+ model = AutoModelForCausalLM.from_pretrained(model_id)
105
+
106
+ lora_config = LoraConfig(
107
+ target_modules=["q_proj", "k_proj"],
108
+ init_lora_weights=False
109
+ )
110
+
111
+ model.add_adapter(lora_config, adapter_name="adapter_1")
112
+ ```
113
+
114
+ Um einen neuen Adapter hinzuzufügen:
115
+
116
+ ```py
117
+ # attach new adapter with same config
118
+ model.add_adapter(lora_config, adapter_name="adapter_2")
119
+ ```
120
+
121
+ Jetzt können Sie mit [`~peft.PeftModel.set_adapter`] festlegen, welcher Adapter verwendet werden soll:
122
+
123
+ ```py
124
+ # use adapter_1
125
+ model.set_adapter("adapter_1")
126
+ output = model.generate(**inputs)
127
+ print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))
128
+
129
+ # use adapter_2
130
+ model.set_adapter("adapter_2")
131
+ output_enabled = model.generate(**inputs)
132
+ print(tokenizer.decode(output_enabled[0], skip_special_tokens=True))
133
+ ```
134
+
135
+ ## Aktivieren und Deaktivieren von Adaptern
136
+
137
+ Sobald Sie einen Adapter zu einem Modell hinzugefügt haben, können Sie das Adaptermodul aktivieren oder deaktivieren. So aktivieren Sie das Adaptermodul:
138
+
139
+ ```py
140
+ from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
141
+ from peft import PeftConfig
142
+
143
+ model_id = "facebook/opt-350m"
144
+ adapter_model_id = "ybelkada/opt-350m-lora"
145
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
146
+ text = "Hello"
147
+ inputs = tokenizer(text, return_tensors="pt")
148
+
149
+ model = AutoModelForCausalLM.from_pretrained(model_id)
150
+ peft_config = PeftConfig.from_pretrained(adapter_model_id)
151
+
152
+ # to initiate with random weights
153
+ peft_config.init_lora_weights = False
154
+
155
+ model.add_adapter(peft_config)
156
+ model.enable_adapters()
157
+ output = model.generate(**inputs)
158
+ ```
159
+
160
+ So deaktivieren Sie das Adaptermodul:
161
+
162
+ ```py
163
+ model.disable_adapters()
164
+ output = model.generate(**inputs)
165
+ ```
166
+
167
+ ## PEFT-Adapter trainieren
168
+
169
+ PEFT-Adapter werden von der Klasse [`Trainer`] unterstützt, so dass Sie einen Adapter für Ihren speziellen Anwendungsfall trainieren können. Dazu müssen Sie nur ein paar weitere Codezeilen hinzufügen. Zum Beispiel, um einen LoRA-Adapter zu trainieren:
170
+
171
+ <Tip>
172
+
173
+ Wenn Sie mit der Feinabstimmung eines Modells mit [`Trainer`] noch nicht vertraut sind, werfen Sie einen Blick auf das Tutorial [Feinabstimmung eines vortrainierten Modells](Training).
174
+
175
+ </Tip>
176
+
177
+ 1. Definieren Sie Ihre Adapterkonfiguration mit dem Aufgabentyp und den Hyperparametern (siehe [`~peft.LoraConfig`] für weitere Details darüber, was die Hyperparameter tun).
178
+
179
+ ```py
180
+ from peft import LoraConfig
181
+
182
+ peft_config = LoraConfig(
183
+ lora_alpha=16,
184
+ lora_dropout=0.1,
185
+ r=64,
186
+ bias="none",
187
+ task_type="CAUSAL_LM",
188
+ )
189
+ ```
190
+
191
+ 2. Fügen Sie dem Modell einen Adapter hinzu.
192
+
193
+ ```py
194
+ model.add_adapter(peft_config)
195
+ ```
196
+
197
+ 3. Jetzt können Sie das Modell an [`Trainer`] übergeben!
198
+
199
+ ```py
200
+ trainer = Trainer(model=model, ...)
201
+ trainer.train()
202
+ ```
203
+
204
+ So speichern Sie Ihren trainierten Adapter und laden ihn wieder:
205
+
206
+ ```py
207
+ model.save_pretrained(save_dir)
208
+ model = AutoModelForCausalLM.from_pretrained(save_dir)
209
+ ```
210
+
211
+ <!--
212
+ TODO: (@younesbelkada @stevhliu)
213
+ - Link to PEFT docs for further details
214
+ - Trainer
215
+ - 8-bit / 4-bit examples ?
216
+ -->
docs/source/de/pipeline_tutorial.md ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Pipelines für Inferenzen
18
+
19
+ Die [`pipeline`] macht es einfach, jedes beliebige Modell aus dem [Hub](https://huggingface.co/models) für die Inferenz auf jede Sprache, Computer Vision, Sprache und multimodale Aufgaben zu verwenden. Selbst wenn Sie keine Erfahrung mit einer bestimmten Modalität haben oder nicht mit dem zugrundeliegenden Code hinter den Modellen vertraut sind, können Sie sie mit der [`pipeline`] für Inferenzen verwenden! In diesem Beispiel lernen Sie, wie:
20
+
21
+ * Eine [`pipeline`] für Inferenz zu verwenden.
22
+ * Einen bestimmten Tokenizer oder ein bestimmtes Modell zu verwenden.
23
+ * Eine [`pipeline`] für Audio-, Vision- und multimodale Aufgaben zu verwenden.
24
+
25
+ <Tip>
26
+
27
+ Eine vollständige Liste der unterstützten Aufgaben und verfügbaren Parameter finden Sie in der [`pipeline`]-Dokumentation.
28
+
29
+ </Tip>
30
+
31
+ ## Verwendung von Pipelines
32
+
33
+ Obwohl jede Aufgabe eine zugehörige [`pipeline`] hat, ist es einfacher, die allgemeine [`pipeline`]-Abstraktion zu verwenden, die alle aufgabenspezifischen Pipelines enthält. Die [`pipeline`] lädt automatisch ein Standardmodell und eine Vorverarbeitungsklasse, die für Ihre Aufgabe inferenzfähig ist.
34
+
35
+ 1. Beginnen Sie mit der Erstellung einer [`pipeline`] und geben Sie eine Inferenzaufgabe an:
36
+
37
+ ```py
38
+ >>> from transformers import pipeline
39
+
40
+ >>> generator = pipeline(task="text-generation")
41
+ ```
42
+
43
+ 2. Übergeben Sie Ihren Eingabetext an die [`pipeline`]:
44
+
45
+ ```py
46
+ >>> generator(
47
+ ... "Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone"
48
+ ... ) # doctest: +SKIP
49
+ [{'generated_text': 'Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Seven for the Iron-priests at the door to the east, and thirteen for the Lord Kings at the end of the mountain'}]
50
+ ```
51
+
52
+ Wenn Sie mehr als eine Eingabe haben, übergeben Sie die Eingabe als Liste:
53
+
54
+ ```py
55
+ >>> generator(
56
+ ... [
57
+ ... "Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone",
58
+ ... "Nine for Mortal Men, doomed to die, One for the Dark Lord on his dark throne",
59
+ ... ]
60
+ ... ) # doctest: +SKIP
61
+ ```
62
+
63
+ Alle zusätzlichen Parameter für Ihre Aufgabe können auch in die [`pipeline`] aufgenommen werden. Die Aufgabe `Text-Generierung` hat eine [`~generation.GenerationMixin.generate`]-Methode mit mehreren Parametern zur Steuerung der Ausgabe. Wenn Sie zum Beispiel mehr als eine Ausgabe erzeugen wollen, setzen Sie den Parameter `num_return_sequences`:
64
+
65
+ ```py
66
+ >>> generator(
67
+ ... "Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone",
68
+ ... num_return_sequences=2,
69
+ ... ) # doctest: +SKIP
70
+ ```
71
+
72
+ ### Wählen Sie ein Modell und einen Tokenizer
73
+
74
+ Die [`pipeline`] akzeptiert jedes Modell aus dem [Hub](https://huggingface.co/models). Auf dem Hub gibt es Tags, mit denen Sie nach einem Modell filtern können, das Sie für Ihre Aufgabe verwenden möchten. Sobald Sie ein passendes Modell ausgewählt haben, laden Sie es mit der entsprechenden `AutoModelFor` und [`AutoTokenizer`] Klasse. Laden Sie zum Beispiel die Klasse [`AutoModelForCausalLM`] für eine kausale Sprachmodellierungsaufgabe:
75
+
76
+ ```py
77
+ >>> from transformers import AutoTokenizer, AutoModelForCausalLM
78
+
79
+ >>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
80
+ >>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
81
+ ```
82
+
83
+ Erstellen Sie eine [`pipeline`] für Ihre Aufgabe, und geben Sie das Modell und den Tokenizer an, die Sie geladen haben:
84
+
85
+ ```py
86
+ >>> from transformers import pipeline
87
+
88
+ >>> generator = pipeline(task="text-generation", model=model, tokenizer=tokenizer)
89
+ ```
90
+
91
+ Übergeben Sie Ihren Eingabetext an die [`pipeline`] , um einen Text zu erzeugen:
92
+
93
+ ```py
94
+ >>> generator(
95
+ ... "Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone"
96
+ ... ) # doctest: +SKIP
97
+ [{'generated_text': 'Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Seven for the Dragon-lords (for them to rule in a world ruled by their rulers, and all who live within the realm'}]
98
+ ```
99
+
100
+ ## Audio-Pipeline
101
+
102
+ Die [`pipeline`] unterstützt auch Audioaufgaben wie Audioklassifizierung und automatische Spracherkennung.
103
+
104
+ Lassen Sie uns zum Beispiel die Emotion in diesem Audioclip klassifizieren:
105
+
106
+ ```py
107
+ >>> from datasets import load_dataset
108
+ >>> import torch
109
+
110
+ >>> torch.manual_seed(42) # doctest: +IGNORE_RESULT
111
+ >>> ds = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation")
112
+ >>> audio_file = ds[0]["audio"]["path"]
113
+ ```
114
+
115
+ Finden Sie ein [Audioklassifikation](https://huggingface.co/models?pipeline_tag=audio-classification) Modell auf dem Model Hub für Emotionserkennung und laden Sie es in die [`pipeline`]:
116
+
117
+ ```py
118
+ >>> from transformers import pipeline
119
+
120
+ >>> audio_classifier = pipeline(
121
+ ... task="audio-classification", model="ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition"
122
+ ... )
123
+ ```
124
+
125
+ Übergeben Sie die Audiodatei an die [`pipeline`]:
126
+
127
+ ```py
128
+ >>> preds = audio_classifier(audio_file)
129
+ >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
130
+ >>> preds
131
+ [{'score': 0.1315, 'label': 'calm'}, {'score': 0.1307, 'label': 'neutral'}, {'score': 0.1274, 'label': 'sad'}, {'score': 0.1261, 'label': 'fearful'}, {'score': 0.1242, 'label': 'happy'}]
132
+ ```
133
+
134
+ ## Bildverarbeitungs-Pipeline
135
+
136
+ Die Verwendung einer [`pipeline`] für Bildverarbeitungsaufgaben ist praktisch identisch.
137
+
138
+ Geben Sie Ihre Aufgabe an und übergeben Sie Ihr Bild an den Klassifikator. Das Bild kann ein Link oder ein lokaler Pfad zu dem Bild sein. Zum Beispiel: Welche Katzenart ist unten abgebildet?
139
+
140
+ ![pipeline-cat-chonk](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg)
141
+
142
+ ```py
143
+ >>> from transformers import pipeline
144
+
145
+ >>> vision_classifier = pipeline(task="image-classification")
146
+ >>> preds = vision_classifier(
147
+ ... images="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
148
+ ... )
149
+ >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
150
+ >>> preds
151
+ [{'score': 0.4335, 'label': 'lynx, catamount'}, {'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'}, {'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'}, {'score': 0.0239, 'label': 'Egyptian cat'}, {'score': 0.0229, 'label': 'tiger cat'}]
152
+ ```
153
+
154
+ ## Multimodale Pipeline
155
+
156
+ Die [`pipeline`] unterstützt mehr als eine Modalität. Eine Aufgabe zur Beantwortung visueller Fragen (VQA) kombiniert zum Beispiel Text und Bild. Verwenden Sie einen beliebigen Bildlink und eine Frage, die Sie zu dem Bild stellen möchten. Das Bild kann eine URL oder ein lokaler Pfad zu dem Bild sein.
157
+
158
+ Wenn Sie zum Beispiel das gleiche Bild wie in der obigen Vision-Pipeline verwenden:
159
+
160
+ ```py
161
+ >>> image = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
162
+ >>> question = "Where is the cat?"
163
+ ```
164
+
165
+ Erstellen Sie eine Pipeline für "vqa" und übergeben Sie ihr das Bild und die Frage:
166
+
167
+ ```py
168
+ >>> from transformers import pipeline
169
+
170
+ >>> vqa = pipeline(task="vqa")
171
+ >>> preds = vqa(image=image, question=question)
172
+ >>> preds = [{"score": round(pred["score"], 4), "answer": pred["answer"]} for pred in preds]
173
+ >>> preds
174
+ [{'score': 0.9112, 'answer': 'snow'}, {'score': 0.8796, 'answer': 'in snow'}, {'score': 0.6717, 'answer': 'outside'}, {'score': 0.0291, 'answer': 'on ground'}, {'score': 0.027, 'answer': 'ground'}]
175
+ ```
docs/source/de/pr_checks.md ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2020 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+
16
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
17
+ rendered properly in your Markdown viewer.
18
+
19
+ -->
20
+
21
+ # Überprüfungen bei einer Pull-Anfrage
22
+
23
+ Wenn Sie eine Pull-Anfrage für 🤗 Transformers öffnen, wird eine ganze Reihe von Prüfungen durchgeführt, um sicherzustellen, dass der Patch, den Sie hinzufügen, nichts Bestehendes zerstört. Es gibt vier Arten von Prüfungen:
24
+ - reguläre Tests
25
+ - Erstellung der Dokumentation
26
+ - Stil von Code und Dokumentation
27
+ - allgemeine Konsistenz des Repository
28
+
29
+ In diesem Dokument werden wir versuchen zu erklären, worum es sich bei diesen verschiedenen Prüfungen handelt und wie Sie sie lokal debuggen können, wenn eine der Prüfungen in Ihrer PR fehlschlägt.
30
+
31
+ Beachten Sie, dass Sie im Idealfall eine Dev-Installation benötigen:
32
+
33
+ ```bash
34
+ pip install transformers[dev]
35
+ ```
36
+
37
+ oder für eine bearbeitbare Installation:
38
+
39
+ ```bash
40
+ pip install -e .[dev]
41
+ ```
42
+
43
+ innerhalb des Transformers Repo. Da die Anzahl der optionalen Abhängigkeiten von Transformers stark zugenommen hat, ist es möglich, dass Sie nicht alle davon bekommen können. Wenn die Dev-Installation fehlschlägt, stellen Sie sicher, dass Sie das Deep Learning-Framework, mit dem Sie arbeiten, installieren (PyTorch, TensorFlow und/oder Flax).
44
+
45
+ ```bash
46
+ pip install transformers[quality]
47
+ ```
48
+
49
+ oder für eine bearbeitbare Installation:
50
+
51
+ ```bash
52
+ pip install -e .[quality]
53
+ ```
54
+
55
+
56
+ ## Tests
57
+
58
+ Alle Jobs, die mit `ci/circleci: run_tests_` beginnen, führen Teile der Transformers-Testsuite aus. Jeder dieser Jobs konzentriert sich auf einen Teil der Bibliothek in einer bestimmten Umgebung: `ci/circleci: run_tests_pipelines_tf` zum Beispiel führt den Pipelines-Test in einer Umgebung aus, in der nur TensorFlow installiert ist.
59
+
60
+ Beachten Sie, dass nur ein Teil der Testsuite jedes Mal ausgeführt wird, um zu vermeiden, dass Tests ausgeführt werden, wenn es keine wirkliche Änderung in den Modulen gibt, die sie testen: ein Dienstprogramm wird ausgeführt, um die Unterschiede in der Bibliothek zwischen vor und nach dem PR zu ermitteln (was GitHub Ihnen auf der Registerkarte "Files changes" anzeigt) und die Tests auszuwählen, die von diesem Unterschied betroffen sind. Dieses Dienstprogramm kann lokal mit ausgeführt werden:
61
+
62
+ ```bash
63
+ python utils/tests_fetcher.py
64
+ ```
65
+
66
+ aus dem Stammverzeichnis des Transformers-Repositoriums. Es wird:
67
+
68
+ 1. Überprüfen Sie für jede Datei im Diff, ob die Änderungen im Code oder nur in Kommentaren oder Docstrings enthalten sind. Nur die Dateien mit echten Codeänderungen werden beibehalten.
69
+ 2. Erstellen Sie eine interne Map, die für jede Datei des Quellcodes der Bibliothek alle Dateien angibt, auf die sie rekursiv Einfluss nimmt. Von Modul A wird gesagt, dass es sich auf Modul B auswirkt, wenn Modul B Modul A importiert. Für die rekursive Auswirkung benötigen wir eine Kette von Modulen, die von Modul A zu Modul B führt und in der jedes Modul das vorherige importiert.
70
+ 3. Wenden Sie diese Zuordnung auf die in Schritt 1 gesammelten Dateien an. So erhalten wir die Liste der Modelldateien, die von der PR betroffen sind.
71
+ 4. Ordnen Sie jede dieser Dateien der/den entsprechenden Testdatei(en) zu und erhalten Sie die Liste der auszuführenden Tests.
72
+
73
+ Wenn Sie das Skript lokal ausführen, sollten Sie die Ergebnisse von Schritt 1, 3 und 4 ausgegeben bekommen und somit wissen, welche Tests ausgeführt werden. Das Skript erstellt außerdem eine Datei namens `test_list.txt`, die die Liste der auszuführenden Tests enthält, die Sie mit dem folgenden Befehl lokal ausführen können:
74
+
75
+ ```bash
76
+ python -m pytest -n 8 --dist=loadfile -rA -s $(cat test_list.txt)
77
+ ```
78
+
79
+ Für den Fall, dass Ihnen etwas entgangen ist, wird die komplette Testreihe ebenfalls täglich ausgeführt.
80
+
81
+ ## Dokumentation erstellen
82
+
83
+ Der Job `build_pr_documentation` erstellt und generiert eine Vorschau der Dokumentation, um sicherzustellen, dass alles in Ordnung ist, wenn Ihr PR zusammengeführt wird. Ein Bot fügt einen Link zur Vorschau der Dokumentation zu Ihrem PR hinzu. Alle Änderungen, die Sie an dem PR vornehmen, werden automatisch in der Vorschau aktualisiert. Wenn die Dokumentation nicht erstellt werden kann, klicken Sie auf **Details** neben dem fehlgeschlagenen Auftrag, um zu sehen, wo der Fehler liegt. Oft ist der Fehler so einfach wie eine fehlende Datei im `toctree`.
84
+
85
+ Wenn Sie daran interessiert sind, die Dokumentation lokal zu erstellen oder in der Vorschau anzusehen, werfen Sie einen Blick in die [`README.md`](https://github.com/huggingface/transformers/tree/main/docs) im Ordner docs.
86
+
87
+ ## Code und Dokumentationsstil
88
+
89
+ Die Formatierung des Codes erfolgt für alle Quelldateien, die Beispiele und die Tests mit `black` und `ruff`. Wir haben auch ein benutzerdefiniertes Tool, das sich um die Formatierung von docstrings und `rst`-Dateien kümmert (`utils/style_doc.py`), sowie um die Reihenfolge der Lazy-Importe, die in den Transformers `__init__.py`-Dateien durchgeführt werden (`utils/custom_init_isort.py`). All dies können Sie starten, indem Sie Folgendes ausführen
90
+
91
+ ```bash
92
+ make style
93
+ ```
94
+
95
+ Das CI prüft, ob diese innerhalb der Prüfung `ci/circleci: check_code_quality` angewendet wurden. Es führt auch `ruff` aus, das einen grundlegenden Blick auf Ihren Code wirft und sich beschwert, wenn es eine undefinierte Variable findet oder eine, die nicht verwendet wird. Um diese Prüfung lokal auszuführen, verwenden Sie
96
+
97
+ ```bash
98
+ make quality
99
+ ```
100
+
101
+ Dies kann sehr viel Zeit in Anspruch nehmen. Um dasselbe nur für die Dateien zu tun, die Sie im aktuellen Zweig geändert haben, führen Sie
102
+
103
+ ```bash
104
+ make fixup
105
+ ```
106
+
107
+ Dieser letzte Befehl führt auch alle zusätzlichen Prüfungen für die Konsistenz des Repositorys durch. Schauen wir uns diese an.
108
+
109
+ ## Repository-Konsistenz
110
+
111
+ Dies fasst alle Tests zusammen, die sicherstellen, dass Ihr PR das Repository in einem guten Zustand verlässt. Sie können diese Prüfung lokal durchführen, indem Sie Folgendes ausführen:
112
+
113
+ ```bash
114
+ make repo-consistency
115
+ ```
116
+
117
+ Dies überprüft, ob:
118
+
119
+ - Alle zum Init hinzugefügten Objekte sind dokumentiert (ausgeführt von `utils/check_repo.py`)
120
+ - Alle `__init__.py`-Dateien haben in ihren beiden Abschnitten den gleichen Inhalt (ausgeführt von `utils/check_inits.py`)
121
+ - Der gesamte Code, der als Kopie eines anderen Moduls identifiziert wurde, stimmt mit dem Original überein (ausgeführt von `utils/check_copies.py`)
122
+ - Alle Konfigurationsklassen haben mindestens einen gültigen Prüfpunkt, der in ihren Dokumentationen erwähnt wird (ausgeführt von `utils/check_config_docstrings.py`)
123
+ - Alle Konfigurationsklassen enthalten nur Attribute, die in den entsprechenden Modellierungsdateien verwendet werden (ausgeführt von `utils/check_config_attributes.py`)
124
+ - Die Übersetzungen der READMEs und der Index des Dokuments haben die gleiche Modellliste wie die Haupt-README (durchgeführt von `utils/check_copies.py`)
125
+ - Die automatisch generierten Tabellen in der Dokumentation sind auf dem neuesten Stand (ausgeführt von `utils/check_table.py`)
126
+ - Die Bibliothek verfügt über alle Objekte, auch wenn nicht alle optionalen Abhängigkeiten installiert sind (ausgeführt von `utils/check_dummies.py`)
127
+
128
+ Sollte diese Prüfung fehlschlagen, müssen die ersten beiden Punkte manuell korrigiert werden, die letzten vier können automatisch für Sie korrigiert werden, indem Sie den Befehl
129
+
130
+ ```bash
131
+ make fix-copies
132
+ ```
133
+
134
+ Zusätzliche Prüfungen betreffen PRs, die neue Modelle hinzufügen, vor allem, dass:
135
+
136
+ - Alle hinzugefügten Modelle befinden sich in einer Auto-Zuordnung (durchgeführt von `utils/check_repo.py`)
137
+ <!-- TODO Sylvain, add a check that makes sure the common tests are implemented.-->
138
+ - Alle Modelle werden ordnungsgemäß getestet (ausgeführt von `utils/check_repo.py`)
139
+
140
+ <!-- TODO Sylvain, add the following
141
+ - All models are added to the main README, inside the main doc
142
+ - All checkpoints used actually exist on the Hub
143
+
144
+ -->
145
+
146
+ ### Kopien prüfen
147
+
148
+ Da die Transformers-Bibliothek in Bezug auf den Modellcode sehr eigenwillig ist und jedes Modell vollständig in einer einzigen Datei implementiert sein sollte, ohne sich auf andere Modelle zu stützen, haben wir einen Mechanismus hinzugefügt, der überprüft, ob eine Kopie des Codes einer Ebene eines bestimmten Modells mit dem Original übereinstimmt. Auf diese Weise können wir bei einer Fehlerbehebung alle anderen betroffenen Modelle sehen und entscheiden, ob wir die Änderung weitergeben oder die Kopie zerstören.
149
+
150
+ <Tip>
151
+
152
+ Wenn eine Datei eine vollständige Kopie einer anderen Datei ist, sollten Sie sie in der Konstante `FULL_COPIES` von `utils/check_copies.py` registrieren.
153
+
154
+ </Tip>
155
+
156
+ Dieser Mechanismus stützt sich auf Kommentare der Form `# Kopiert von xxx`. Das `xxx` sollte den gesamten Pfad zu der Klasse der Funktion enthalten, die darunter kopiert wird. Zum Beispiel ist `RobertaSelfOutput` eine direkte Kopie der Klasse `BertSelfOutput`. Sie können also [hier](https://github.com/huggingface/transformers/blob/2bd7a27a671fd1d98059124024f580f8f5c0f3b5/src/transformers/models/roberta/modeling_roberta.py#L289) sehen, dass sie einen Kommentar hat:
157
+
158
+ ```py
159
+ # Copied from transformers.models.bert.modeling_bert.BertSelfOutput
160
+ ```
161
+
162
+ Beachten Sie, dass Sie dies nicht auf eine ganze Klasse anwenden, sondern auf die entsprechenden Methoden, von denen kopiert wird. Zum Beispiel [hier](https://github.com/huggingface/transformers/blob/2bd7a27a671fd1d98059124024f580f8f5c0f3b5/src/transformers/models/roberta/modeling_roberta.py#L598) können Sie sehen, wie `RobertaPreTrainedModel._init_weights` von der gleichen Methode in `BertPreTrainedModel` mit dem Kommentar kopiert wird:
163
+
164
+ ```py
165
+ # Copied from transformers.models.bert.modeling_bert.BertPreTrainedModel._init_weights
166
+ ```
167
+
168
+ Manchmal ist die Kopie bis auf die Namen genau gleich: zum Beispiel verwenden wir in `RobertaAttention` `RobertaSelfAttention` anstelle von `BertSelfAttention`, aber ansonsten ist der Code genau derselbe. Aus diesem Grund unterstützt `#Copied from` einfache String-Ersetzungen mit der folgenden Syntax: `Kopiert von xxx mit foo->bar`. Das bedeutet, dass der Code kopiert wird, wobei alle Instanzen von "foo" durch "bar" ersetzt werden. Sie können sehen, wie es [hier](https://github.com/huggingface/transformers/blob/2bd7a27a671fd1d98059124024f580f8f5c0f3b5/src/transformers/models/roberta/modeling_roberta.py#L304C1-L304C86) in `RobertaAttention` mit dem Kommentar verwendet wird:
169
+
170
+ ```py
171
+ # Copied from transformers.models.bert.modeling_bert.BertAttention with Bert->Roberta
172
+ ```
173
+
174
+ Beachten Sie, dass um den Pfeil herum keine Leerzeichen stehen sollten (es sei denn, das Leerzeichen ist Teil des zu ersetzenden Musters, natürlich).
175
+
176
+ Sie können mehrere Muster durch ein Komma getrennt hinzufügen. Zum Beispiel ist hier `CamemberForMaskedLM` eine direkte Kopie von `RobertaForMaskedLM` mit zwei Ersetzungen: `Roberta` zu `Camembert` und `ROBERTA` zu `CAMEMBERT`. Sie können [hier](https://github.com/huggingface/transformers/blob/15082a9dc6950ecae63a0d3e5060b2fc7f15050a/src/transformers/models/camembert/modeling_camembert.py#L929) sehen, wie dies mit dem Kommentar gemacht wird:
177
+
178
+ ```py
179
+ # Copied from transformers.models.roberta.modeling_roberta.RobertaForMaskedLM with Roberta->Camembert, ROBERTA->CAMEMBERT
180
+ ```
181
+
182
+ Wenn die Reihenfolge eine Rolle spielt (weil eine der Ersetzungen mit einer vorherigen in Konflikt geraten könnte), werden die Ersetzungen von links nach rechts ausgeführt.
183
+
184
+ <Tip>
185
+
186
+ Wenn die Ersetzungen die Formatierung ändern (wenn Sie z.B. einen kurzen Namen durch einen sehr langen Namen ersetzen), wird die Kopie nach Anwendung des automatischen Formats überprüft.
187
+
188
+ </Tip>
189
+
190
+ Eine andere Möglichkeit, wenn es sich bei den Mustern nur um verschiedene Umschreibungen derselben Ersetzung handelt (mit einer groß- und einer kleingeschriebenen Variante), besteht darin, die Option `all-casing` hinzuzufügen. [Hier](https://github.com/huggingface/transformers/blob/15082a9dc6950ecae63a0d3e5060b2fc7f15050a/src/transformers/models/mobilebert/modeling_mobilebert.py#L1237) ist ein Beispiel in `MobileBertForSequenceClassification` mit dem Kommentar:
191
+
192
+ ```py
193
+ # Copied from transformers.models.bert.modeling_bert.BertForSequenceClassification with Bert->MobileBert all-casing
194
+ ```
195
+
196
+ In diesem Fall wird der Code von `BertForSequenceClassification` kopiert, indem er ersetzt wird:
197
+ - `Bert` durch `MobileBert` (zum Beispiel bei der Verwendung von `MobileBertModel` in der Init)
198
+ - `bert` durch `mobilebert` (zum Beispiel bei der Definition von `self.mobilebert`)
199
+ - `BERT` durch `MOBILEBERT` (in der Konstante `MOBILEBERT_INPUTS_DOCSTRING`)
docs/source/de/preprocessing.md ADDED
@@ -0,0 +1,506 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Vorverarbeiten
18
+
19
+ [[open-in-colab]]
20
+
21
+ Bevor Sie Ihre Daten in einem Modell verwenden können, müssen die Daten in ein für das Modell akzeptables Format gebracht werden. Ein Modell versteht keine Rohtexte, Bilder oder Audiodaten. Diese Eingaben müssen in Zahlen umgewandelt und zu Tensoren zusammengesetzt werden. In dieser Anleitung werden Sie:
22
+
23
+ * Textdaten mit einem Tokenizer vorverarbeiten.
24
+ * Bild- oder Audiodaten mit einem Feature Extractor vorverarbeiten.
25
+ * Daten für eine multimodale Aufgabe mit einem Prozessor vorverarbeiten.
26
+
27
+ ## NLP
28
+
29
+ <Youtube id="Yffk5aydLzg"/>
30
+
31
+ Das wichtigste Werkzeug zur Verarbeitung von Textdaten ist ein [Tokenizer](main_classes/tokenizer). Ein Tokenizer zerlegt Text zunächst nach einer Reihe von Regeln in *Token*. Die Token werden in Zahlen umgewandelt, die zum Aufbau von Tensoren als Eingabe für ein Modell verwendet werden. Alle zusätzlichen Eingaben, die ein Modell benötigt, werden ebenfalls vom Tokenizer hinzugefügt.
32
+
33
+ <Tip>
34
+
35
+ Wenn Sie ein vortrainiertes Modell verwenden möchten, ist es wichtig, den zugehörigen vortrainierten Tokenizer zu verwenden. Dadurch wird sichergestellt, dass der Text auf die gleiche Weise aufgeteilt wird wie das Pretraining-Korpus und die gleichen entsprechenden Token-zu-Index (in der Regel als *vocab* bezeichnet) während des Pretrainings verwendet werden.
36
+
37
+ </Tip>
38
+
39
+ Laden Sie einen vortrainierten Tokenizer mit der Klasse [AutoTokenizer], um schnell loszulegen. Damit wird das *vocab* heruntergeladen, das verwendet wird, wenn ein Modell vortrainiert wird.
40
+
41
+ ### Tokenize
42
+
43
+ Laden Sie einen vortrainierten Tokenizer mit [`AutoTokenizer.from_pretrained`]:
44
+
45
+ ```py
46
+ >>> from transformers import AutoTokenizer
47
+
48
+ >>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
49
+ ```
50
+
51
+ Dann übergeben Sie Ihren Satz an den Tokenizer:
52
+
53
+ ```py
54
+ >>> encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
55
+ >>> print(encoded_input)
56
+ {'input_ids': [101, 2079, 2025, 19960, 10362, 1999, 1996, 3821, 1997, 16657, 1010, 2005, 2027, 2024, 11259, 1998, 4248, 2000, 4963, 1012, 102],
57
+ 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
58
+ 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
59
+ ```
60
+
61
+ Der Tokenizer gibt ein Wörterbuch mit drei wichtigen Elementen zurück:
62
+
63
+ * [input_ids](glossary#input-ids) sind die Indizes, die den einzelnen Token im Satz entsprechen.
64
+ * [attention_mask](glossary#attention-mask) gibt an, ob ein Token beachtet werden soll oder nicht.
65
+ * [token_type_ids](glossary#token-type-ids) gibt an, zu welcher Sequenz ein Token gehört, wenn es mehr als eine Sequenz gibt.
66
+
67
+ Sie können die `input_ids` dekodieren, um die ursprüngliche Eingabe zurückzugeben:
68
+
69
+ ```py
70
+ >>> tokenizer.decode(encoded_input["input_ids"])
71
+ '[CLS] Do not meddle in the affairs of wizards, for they are subtle and quick to anger. [SEP]'
72
+ ```
73
+
74
+ Wie Sie sehen können, hat der Tokenisierer zwei spezielle Token - `CLS` und `SEP` (Klassifikator und Separator) - zum Satz hinzugefügt. Nicht alle Modelle benötigen
75
+ spezielle Token, aber wenn dies der Fall ist, fügt der Tokenisierer sie automatisch für Sie hinzu.
76
+
77
+ Wenn Sie mehrere Sätze verarbeiten wollen, übergeben Sie die Sätze als Liste an den Tokenizer:
78
+
79
+ ```py
80
+ >>> batch_sentences = [
81
+ ... "But what about second breakfast?",
82
+ ... "Don't think he knows about second breakfast, Pip.",
83
+ ... "What about elevensies?",
84
+ ... ]
85
+ >>> encoded_inputs = tokenizer(batch_sentences)
86
+ >>> print(encoded_inputs)
87
+ {'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102],
88
+ [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
89
+ [101, 1327, 1164, 5450, 23434, 136, 102]],
90
+ 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0],
91
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
92
+ [0, 0, 0, 0, 0, 0, 0]],
93
+ 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1],
94
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
95
+ [1, 1, 1, 1, 1, 1, 1]]}
96
+ ```
97
+
98
+ ### Pad
99
+
100
+ Dies bringt uns zu einem wichtigen Thema. Wenn Sie einen Haufen von Sätzen verarbeiten, sind diese nicht immer gleich lang. Das ist ein Problem, weil Tensoren, die Eingabe für das Modell, eine einheitliche Form haben müssen. Padding ist eine Strategie, die sicherstellt, dass Tensoren rechteckig sind, indem ein spezielles *Padding-Token* zu Sätzen mit weniger Token hinzugefügt wird.
101
+
102
+ Setzen Sie den Parameter "padding" auf "true", um die kürzeren Sequenzen im Stapel so aufzufüllen, dass sie der längsten Sequenz entsprechen:
103
+
104
+ ```py
105
+ >>> batch_sentences = [
106
+ ... "But what about second breakfast?",
107
+ ... "Don't think he knows about second breakfast, Pip.",
108
+ ... "What about elevensies?",
109
+ ... ]
110
+ >>> encoded_input = tokenizer(batch_sentences, padding=True)
111
+ >>> print(encoded_input)
112
+ {'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
113
+ [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
114
+ [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]],
115
+ 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
116
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
117
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
118
+ 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
119
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
120
+ [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]}
121
+ ```
122
+
123
+ Beachten Sie, dass der Tokenizer den ersten und den dritten Satz mit einer "0" aufgefüllt hat, weil sie kürzer sind!
124
+
125
+ ### Kürzung
126
+
127
+ Auf der anderen Seite des Spektrums kann es vorkommen, dass eine Sequenz zu lang für ein Modell ist. In diesem Fall müssen Sie die Sequenz auf eine kürzere Länge kürzen.
128
+
129
+ Setzen Sie den Parameter "truncation" auf "true", um eine Sequenz auf die vom Modell akzeptierte Höchstlänge zu kürzen:
130
+
131
+ ```py
132
+ >>> batch_sentences = [
133
+ ... "But what about second breakfast?",
134
+ ... "Don't think he knows about second breakfast, Pip.",
135
+ ... "What about elevensies?",
136
+ ... ]
137
+ >>> encoded_input = tokenizer(batch_sentences, padding=True, truncation=True)
138
+ >>> print(encoded_input)
139
+ {'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
140
+ [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
141
+ [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]],
142
+ 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
143
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
144
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
145
+ 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
146
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
147
+ [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]}
148
+ ```
149
+
150
+ ### Tensoren erstellen
151
+
152
+ Schließlich möchten Sie, dass der Tokenizer die tatsächlichen Tensoren zurückgibt, die dem Modell zugeführt werden.
153
+
154
+ Setzen Sie den Parameter `return_tensors` entweder auf `pt` für PyTorch, oder `tf` für TensorFlow:
155
+
156
+ <frameworkcontent>
157
+ <pt>
158
+
159
+ ```py
160
+ >>> batch_sentences = [
161
+ ... "But what about second breakfast?",
162
+ ... "Don't think he knows about second breakfast, Pip.",
163
+ ... "What about elevensies?",
164
+ ... ]
165
+ >>> encoded_input = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="pt")
166
+ >>> print(encoded_input)
167
+ {'input_ids': tensor([[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
168
+ [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
169
+ [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]]),
170
+ 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
171
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
172
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]),
173
+ 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
174
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
175
+ [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]])}
176
+ ```
177
+ </pt>
178
+ <tf>
179
+ ```py
180
+ >>> batch_sentences = [
181
+ ... "But what about second breakfast?",
182
+ ... "Don't think he knows about second breakfast, Pip.",
183
+ ... "What about elevensies?",
184
+ ... ]
185
+ >>> encoded_input = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="tf")
186
+ >>> print(encoded_input)
187
+ {'input_ids': <tf.Tensor: shape=(2, 9), dtype=int32, numpy=
188
+ array([[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0],
189
+ [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102],
190
+ [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]],
191
+ dtype=int32)>,
192
+ 'token_type_ids': <tf.Tensor: shape=(2, 9), dtype=int32, numpy=
193
+ array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
194
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
195
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)>,
196
+ 'attention_mask': <tf.Tensor: shape=(2, 9), dtype=int32, numpy=
197
+ array([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
198
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
199
+ [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)>}
200
+ ```
201
+ </tf>
202
+ </frameworkcontent>
203
+
204
+ ## Audio
205
+
206
+ Audioeingaben werden anders vorverarbeitet als Texteingaben, aber das Endziel bleibt dasselbe: numerische Sequenzen zu erstellen, die das Modell verstehen kann. Ein [feature extractor](main_classes/feature_extractor) dient dem ausdrücklichen Zweck, Merkmale aus Rohbild- oder Audiodaten zu extrahieren und in Tensoren zu konvertieren. Bevor Sie beginnen, installieren Sie 🤗 Datasets, um einen Audio-Datensatz zu laden, mit dem Sie experimentieren können:
207
+
208
+ ```bash
209
+ pip install datasets
210
+ ```
211
+
212
+ Laden Sie den [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) Datensatz (weitere Informationen zum Laden eines Datensatzes finden Sie im 🤗 [Datasets tutorial](https://huggingface.co/docs/datasets/load_hub)):
213
+
214
+ ```py
215
+ >>> from datasets import load_dataset, Audio
216
+
217
+ >>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
218
+ ```
219
+
220
+ Greifen Sie auf das erste Element der `audio`-Spalte zu, um einen Blick auf die Eingabe zu werfen. Durch den Aufruf der Spalte "audio" wird die Audiodatei automatisch geladen und neu gesampelt:
221
+
222
+ ```py
223
+ >>> dataset[0]["audio"]
224
+ {'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
225
+ 0. , 0. ], dtype=float32),
226
+ 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
227
+ 'sampling_rate': 8000}
228
+ ```
229
+
230
+ Dies gibt drei Elemente zurück:
231
+
232
+ * "array" ist das Sprachsignal, das als 1D-Array geladen - und möglicherweise neu gesampelt - wurde.
233
+ * Pfad" zeigt auf den Speicherort der Audiodatei.
234
+ * `sampling_rate` bezieht sich darauf, wie viele Datenpunkte im Sprachsignal pro Sekunde gemessen werden.
235
+
236
+ ### Resample
237
+
238
+ Für dieses Tutorial werden Sie das Modell [Wav2Vec2](https://huggingface.co/facebook/wav2vec2-base) verwenden. Wie Sie aus der Modellkarte ersehen können, ist das Wav2Vec2-Modell auf 16kHz abgetastetes Sprachaudio vortrainiert. Es ist wichtig, dass die Abtastrate Ihrer Audiodaten mit der Abtastrate des Datensatzes übereinstimmt, der für das Pre-Training des Modells verwendet wurde. Wenn die Abtastrate Ihrer Daten nicht dieselbe ist, müssen Sie Ihre Audiodaten neu abtasten.
239
+
240
+ Der Datensatz [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) hat zum Beispiel eine Abtastrate von 8000 kHz. Um das Wav2Vec2-Modell mit diesem Datensatz verwenden zu können, müssen Sie die Abtastrate auf 16 kHz erhöhen:
241
+
242
+ ```py
243
+ >>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
244
+ >>> dataset[0]["audio"]
245
+ {'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
246
+ 0. , 0. ], dtype=float32),
247
+ 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
248
+ 'sampling_rate': 8000}
249
+ ```
250
+
251
+ 1. Verwenden Sie die Methode [`~datasets.Dataset.cast_column`] von 🤗 Datasets, um die Abtastrate auf 16kHz zu erhöhen:
252
+
253
+ ```py
254
+ >>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
255
+ ```
256
+
257
+ 2. Laden Sie die Audiodatei:
258
+
259
+ ```py
260
+ >>> dataset[0]["audio"]
261
+ {'array': array([ 2.3443763e-05, 2.1729663e-04, 2.2145823e-04, ...,
262
+ 3.8356509e-05, -7.3497440e-06, -2.1754686e-05], dtype=float32),
263
+ 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
264
+ 'sampling_rate': 16000}
265
+ ```
266
+
267
+ Wie Sie sehen können, ist die Abtastrate jetzt 16kHz!
268
+
269
+ ### Merkmalsextraktor
270
+
271
+ Der nächste Schritt ist das Laden eines Merkmalsextraktors, um die Eingabe zu normalisieren und aufzufüllen. Beim Auffüllen von Textdaten wird für kürzere Sequenzen ein `0` hinzugefügt. Die gleiche Idee gilt für Audiodaten, und der Audio-Feature-Extraktor fügt eine `0` - interpretiert als Stille - zu `array` hinzu.
272
+
273
+ Laden Sie den Merkmalsextraktor mit [`AutoFeatureExtractor.from_pretrained`]:
274
+
275
+ ```py
276
+ >>> from transformers import AutoFeatureExtractor
277
+
278
+ >>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")
279
+ ```
280
+
281
+ Übergeben Sie das Audio-"Array" an den Feature-Extraktor. Wir empfehlen auch, das Argument `sampling_rate` im Feature Extractor hinzuzufügen, um eventuell auftretende stille Fehler besser zu beheben.
282
+
283
+ ```py
284
+ >>> audio_input = [dataset[0]["audio"]["array"]]
285
+ >>> feature_extractor(audio_input, sampling_rate=16000)
286
+ {'input_values': [array([ 3.8106556e-04, 2.7506407e-03, 2.8015103e-03, ...,
287
+ 5.6335266e-04, 4.6588284e-06, -1.7142107e-04], dtype=float32)]}
288
+ ```
289
+
290
+ ### Auffüllen und Kürzen
291
+
292
+ Genau wie beim Tokenizer können Sie variable Sequenzen in einem Stapel durch Auffüllen oder Abschneiden behandeln. Werfen Sie einen Blick auf die Sequenzlänge dieser beiden Audiobeispiele:
293
+
294
+ ```py
295
+ >>> dataset[0]["audio"]["array"].shape
296
+ (173398,)
297
+
298
+ >>> dataset[1]["audio"]["array"].shape
299
+ (106496,)
300
+ ```
301
+
302
+ Wie Sie sehen können, hat das erste Beispiel eine längere Sequenz als das zweite Beispiel. Lassen Sie uns eine Funktion erstellen, die den Datensatz vorverarbeitet. Geben Sie eine maximale Länge der Probe an, und der Feature-Extraktor wird die Sequenzen entweder auffüllen oder abschneiden, damit sie dieser Länge entsprechen:
303
+
304
+ ```py
305
+ >>> def preprocess_function(examples):
306
+ ... audio_arrays = [x["array"] for x in examples["audio"]]
307
+ ... inputs = feature_extractor(
308
+ ... audio_arrays,
309
+ ... sampling_rate=16000,
310
+ ... padding=True,
311
+ ... max_length=100000,
312
+ ... truncation=True,
313
+ ... )
314
+ ... return inputs
315
+ ```
316
+
317
+ Wenden Sie die Funktion auf die ersten paar Beispiele im Datensatz an:
318
+
319
+ ```py
320
+ >>> processed_dataset = preprocess_function(dataset[:5])
321
+ ```
322
+
323
+ Schauen Sie sich nun noch einmal die verarbeiteten Beispiel-Längen an:
324
+
325
+ ```py
326
+ >>> processed_dataset["input_values"][0].shape
327
+ (100000,)
328
+
329
+ >>> processed_dataset["input_values"][1].shape
330
+ (100000,)
331
+ ```
332
+
333
+ Die Länge der ersten beiden Beispiele entspricht nun der von Ihnen angegebenen Maximallänge.
334
+
335
+ ## Bildverarbeitung
336
+
337
+ Ein Merkmalsextraktor wird auch verwendet, um Bilder für Bildverarbeitungsaufgaben zu verarbeiten. Auch hier besteht das Ziel darin, das Rohbild in eine Reihe von Tensoren als Eingabe zu konvertieren.
338
+
339
+ Laden wir den [food101](https://huggingface.co/datasets/food101) Datensatz für dieses Tutorial. Verwenden Sie den Parameter 🤗 Datasets `split`, um nur eine kleine Stichprobe aus dem Trainingssplit zu laden, da der Datensatz recht groß ist:
340
+
341
+ ```py
342
+ >>> from datasets import load_dataset
343
+
344
+ >>> dataset = load_dataset("food101", split="train[:100]")
345
+ ```
346
+
347
+ Als Nächstes sehen Sie sich das Bild mit dem Merkmal 🤗 Datensätze [Bild](https://huggingface.co/docs/datasets/package_reference/main_classes?highlight=image#datasets.Image) an:
348
+
349
+ ```py
350
+ >>> dataset[0]["image"]
351
+ ```
352
+
353
+ ![vision-preprocess-tutorial.png](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/vision-preprocess-tutorial.png)
354
+
355
+ ### Merkmalsextraktor
356
+
357
+ Laden Sie den Merkmalsextraktor mit [`AutoImageProcessor.from_pretrained`]:
358
+
359
+ ```py
360
+ >>> from transformers import AutoImageProcessor
361
+
362
+ >>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")
363
+ ```
364
+
365
+ ### Datenerweiterung
366
+
367
+ Bei Bildverarbeitungsaufgaben ist es üblich, den Bildern als Teil der Vorverarbeitung eine Art von Datenerweiterung hinzuzufügen. Sie können Erweiterungen mit jeder beliebigen Bibliothek hinzufügen, aber in diesem Tutorial werden Sie das Modul [`transforms`](https://pytorch.org/vision/stable/transforms.html) von torchvision verwenden.
368
+
369
+ 1. Normalisieren Sie das Bild und verwenden Sie [`Compose`](https://pytorch.org/vision/master/generated/torchvision.transforms.Compose.html), um einige Transformationen - [`RandomResizedCrop`](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomResizedCrop.html) und [`ColorJitter`](https://pytorch.org/vision/main/generated/torchvision.transforms.ColorJitter.html) - miteinander zu verknüpfen:
370
+
371
+ ```py
372
+ >>> from torchvision.transforms import Compose, Normalize, RandomResizedCrop, ColorJitter, ToTensor
373
+
374
+ >>> normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
375
+ >>> _transforms = Compose(
376
+ ... [RandomResizedCrop(image_processor.size["height"]), ColorJitter(brightness=0.5, hue=0.5), ToTensor(), normalize]
377
+ ... )
378
+ ```
379
+
380
+ 2. Das Modell akzeptiert [`pixel_values`](model_doc/visionencoderdecoder#transformers.VisionEncoderDecoderModel.forward.pixel_values) als Eingabe. Dieser Wert wird vom Merkmalsextraktor erzeugt. Erstellen Sie eine Funktion, die `pixel_values` aus den Transformationen erzeugt:
381
+
382
+ ```py
383
+ >>> def transforms(examples):
384
+ ... examples["pixel_values"] = [_transforms(image.convert("RGB")) for image in examples["image"]]
385
+ ... return examples
386
+ ```
387
+
388
+ 3. Dann verwenden Sie 🤗 Datasets [`set_transform`](https://huggingface.co/docs/datasets/process#format-transform), um die Transformationen im laufenden Betrieb anzuwenden:
389
+
390
+ ```py
391
+ >>> dataset.set_transform(transforms)
392
+ ```
393
+
394
+ 4. Wenn Sie nun auf das Bild zugreifen, werden Sie feststellen, dass der Feature Extractor die Modelleingabe "pixel_values" hinzugefügt hat:
395
+
396
+ ```py
397
+ >>> dataset[0]["image"]
398
+ {'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512 at 0x7F1A7B0630D0>,
399
+ 'label': 6,
400
+ 'pixel_values': tensor([[[ 0.0353, 0.0745, 0.1216, ..., -0.9922, -0.9922, -0.9922],
401
+ [-0.0196, 0.0667, 0.1294, ..., -0.9765, -0.9843, -0.9922],
402
+ [ 0.0196, 0.0824, 0.1137, ..., -0.9765, -0.9686, -0.8667],
403
+ ...,
404
+ [ 0.0275, 0.0745, 0.0510, ..., -0.1137, -0.1216, -0.0824],
405
+ [ 0.0667, 0.0824, 0.0667, ..., -0.0588, -0.0745, -0.0980],
406
+ [ 0.0353, 0.0353, 0.0431, ..., -0.0039, -0.0039, -0.0588]],
407
+
408
+ [[ 0.2078, 0.2471, 0.2863, ..., -0.9451, -0.9373, -0.9451],
409
+ [ 0.1608, 0.2471, 0.3098, ..., -0.9373, -0.9451, -0.9373],
410
+ [ 0.2078, 0.2706, 0.3020, ..., -0.9608, -0.9373, -0.8275],
411
+ ...,
412
+ [-0.0353, 0.0118, -0.0039, ..., -0.2392, -0.2471, -0.2078],
413
+ [ 0.0196, 0.0353, 0.0196, ..., -0.1843, -0.2000, -0.2235],
414
+ [-0.0118, -0.0039, -0.0039, ..., -0.0980, -0.0980, -0.1529]],
415
+
416
+ [[ 0.3961, 0.4431, 0.4980, ..., -0.9216, -0.9137, -0.9216],
417
+ [ 0.3569, 0.4510, 0.5216, ..., -0.9059, -0.9137, -0.9137],
418
+ [ 0.4118, 0.4745, 0.5216, ..., -0.9137, -0.8902, -0.7804],
419
+ ...,
420
+ [-0.2314, -0.1922, -0.2078, ..., -0.4196, -0.4275, -0.3882],
421
+ [-0.1843, -0.1686, -0.2000, ..., -0.3647, -0.3804, -0.4039],
422
+ [-0.1922, -0.1922, -0.1922, ..., -0.2941, -0.2863, -0.3412]]])}
423
+ ```
424
+
425
+ Hier sehen Sie, wie das Bild nach der Vorverarbeitung aussieht. Wie von den angewandten Transformationen zu erwarten, wurde das Bild willkürlich beschnitten und seine Farbeigenschaften sind anders.
426
+
427
+ ```py
428
+ >>> import numpy as np
429
+ >>> import matplotlib.pyplot as plt
430
+
431
+ >>> img = dataset[0]["pixel_values"]
432
+ >>> plt.imshow(img.permute(1, 2, 0))
433
+ ```
434
+
435
+ ![preprocessed_image](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/preprocessed_image.png)
436
+
437
+ ## Multimodal
438
+
439
+ Für multimodale Aufgaben werden Sie eine Kombination aus allem, was Sie bisher gelernt haben, verwenden und Ihre Fähigkeiten auf eine Aufgabe der automatischen Spracherkennung (ASR) anwenden. Dies bedeutet, dass Sie einen:
440
+
441
+ * Feature Extractor zur Vorverarbeitung der Audiodaten.
442
+ * Tokenizer, um den Text zu verarbeiten.
443
+
444
+ Kehren wir zum [LJ Speech](https://huggingface.co/datasets/lj_speech) Datensatz zurück:
445
+
446
+ ```py
447
+ >>> from datasets import load_dataset
448
+
449
+ >>> lj_speech = load_dataset("lj_speech", split="train")
450
+ ```
451
+
452
+ Da Sie hauptsächlich an den Spalten "Audio" und "Text" interessiert sind, entfernen Sie die anderen Spalten:
453
+
454
+ ```py
455
+ >>> lj_speech = lj_speech.map(remove_columns=["file", "id", "normalized_text"])
456
+ ```
457
+
458
+ Schauen Sie sich nun die Spalten "Audio" und "Text" an:
459
+
460
+ ```py
461
+ >>> lj_speech[0]["audio"]
462
+ {'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
463
+ 7.3242188e-04, 2.1362305e-04, 6.1035156e-05], dtype=float32),
464
+ 'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
465
+ 'sampling_rate': 22050}
466
+
467
+ >>> lj_speech[0]["text"]
468
+ 'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'
469
+ ```
470
+
471
+ Erinnern Sie sich an den früheren Abschnitt über die Verarbeitung von Audiodaten: Sie sollten immer die Abtastrate Ihrer Audiodaten [resample](preprocessing#audio), damit sie mit der Abtastrate des Datensatzes übereinstimmt, der für das Vortraining eines Modells verwendet wird:
472
+
473
+ ```py
474
+ >>> lj_speech = lj_speech.cast_column("audio", Audio(sampling_rate=16_000))
475
+ ```
476
+
477
+ ### Prozessor
478
+
479
+ Ein Processor kombiniert einen Feature-Extraktor und einen Tokenizer. Laden Sie einen Processor mit [`AutoProcessor.from_pretrained`]:
480
+
481
+ ```py
482
+ >>> from transformers import AutoProcessor
483
+
484
+ >>> processor = AutoProcessor.from_pretrained("facebook/wav2vec2-base-960h")
485
+ ```
486
+
487
+ 1. Erstellen Sie eine Funktion, die die Audiodaten zu `input_values` verarbeitet und den Text zu `labels` tokenisiert. Dies sind Ihre Eingaben für das Modell:
488
+
489
+ ```py
490
+ >>> def prepare_dataset(example):
491
+ ... audio = example["audio"]
492
+
493
+ ... example.update(processor(audio=audio["array"], text=example["text"], sampling_rate=16000))
494
+
495
+ ... return example
496
+ ```
497
+
498
+ 2. Wenden Sie die Funktion "prepare_dataset" auf ein Beispiel an:
499
+
500
+ ```py
501
+ >>> prepare_dataset(lj_speech[0])
502
+ ```
503
+
504
+ Beachten Sie, dass der Processor `input_values` und `labels` hinzugefügt hat. Auch die Abtastrate wurde korrekt auf 16kHz heruntergerechnet.
505
+
506
+ Toll, Sie sollten jetzt in der Lage sein, Daten für jede Modalität vorzuverarbeiten und sogar verschiedene Modalitäten zu kombinieren! Im nächsten Kurs lernen Sie, wie Sie ein Modell mit Ihren neu aufbereiteten Daten feinabstimmen können.
docs/source/de/quicktour.md ADDED
@@ -0,0 +1,438 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Schnellstart
18
+
19
+ [[open-in-colab]]
20
+
21
+ Mit 🤗 Transformers können Sie sofort loslegen! Verwenden Sie die [`pipeline`] für schnelle Inferenz und laden Sie schnell ein vortrainiertes Modell und einen Tokenizer mit einer [AutoClass](./model_doc/auto), um Ihre Text-, Bild- oder Audioaufgabe zu lösen.
22
+
23
+ <Tip>
24
+
25
+ Alle in der Dokumentation vorgestellten Codebeispiele haben oben links einen Umschalter für PyTorch und TensorFlow. Wenn
26
+ nicht, wird erwartet, dass der Code für beide Backends ohne Änderungen funktioniert.
27
+
28
+ </Tip>
29
+
30
+ ## Pipeline
31
+
32
+ [`pipeline`] ist der einfachste Weg, ein vortrainiertes Modell für eine bestimmte Aufgabe zu verwenden.
33
+
34
+ <Youtube id="tiZFewofSLM"/>
35
+
36
+ Die [`pipeline`] unterstützt viele gängige Aufgaben:
37
+
38
+ **Text**:
39
+ * Stimmungsanalyse: Klassifizierung der Polarität eines gegebenen Textes.
40
+ * Textgenerierung (auf Englisch): Generierung von Text aus einer gegebenen Eingabe.
41
+ * Name-Entity-Recognition (NER): Kennzeichnung jedes Worts mit der Entität, die es repräsentiert (Person, Datum, Ort usw.).
42
+ * Beantwortung von Fragen: Extrahieren der Antwort aus dem Kontext, wenn ein gewisser Kontext und eine Frage gegeben sind.
43
+ * Fill-mask: Ausfüllen von Lücken in einem Text mit maskierten Wörtern.
44
+ * Zusammenfassung: Erstellung einer Zusammenfassung einer langen Text- oder Dokumentensequenz.
45
+ * Übersetzung: Übersetzen eines Textes in eine andere Sprache.
46
+ * Merkmalsextraktion: Erstellen einer Tensordarstellung des Textes.
47
+
48
+ **Bild**:
49
+ * Bildklassifizierung: Klassifizierung eines Bildes.
50
+ * Bildsegmentierung: Klassifizierung jedes Pixels in einem Bild.
51
+ * Objekterkennung: Erkennen von Objekten innerhalb eines Bildes.
52
+
53
+ **Audio**:
54
+ * Audioklassifizierung: Zuweisung eines Labels zu einem bestimmten Audiosegment.
55
+ * Automatische Spracherkennung (ASR): Transkription von Audiodaten in Text.
56
+
57
+ <Tip>
58
+
59
+ Für mehr Details über die [`pipeline`] und assoziierte Aufgaben, schauen Sie in die Dokumentation [hier](./main_classes/pipelines).
60
+
61
+ </Tip>
62
+
63
+ ### Verwendung der Pipeline
64
+
65
+ Im folgenden Beispiel werden Sie die [`pipeline`] für die Stimmungsanalyse verwenden.
66
+
67
+ Installieren Sie die folgenden Abhängigkeiten, falls Sie dies nicht bereits getan haben:
68
+
69
+ <frameworkcontent>
70
+ <pt>
71
+
72
+ ```bash
73
+ pip install torch
74
+ ```
75
+ </pt>
76
+ <tf>
77
+
78
+ ```bash
79
+ pip install tensorflow
80
+ ```
81
+ </tf>
82
+ </frameworkcontent>
83
+
84
+ Importieren sie die [`pipeline`] und spezifizieren sie die Aufgabe, welche sie lösen möchten:
85
+
86
+ ```py
87
+ >>> from transformers import pipeline
88
+
89
+ >>> classifier = pipeline("sentiment-analysis")
90
+ ```
91
+
92
+ Die Pipeline lädt ein standardmäßiges [vortrainiertes Modell](https://huggingface.co/distilbert/distilbert-base-uncased-finetuned-sst-2-english) und einen Tokenizer für die Stimmungs-Analyse herunter und speichert sie. Jetzt können Sie den "Klassifikator" auf Ihren Zieltext anwenden:
93
+
94
+ ```py
95
+ >>> classifier("We are very happy to show you the 🤗 Transformers library.")
96
+ [{'label': 'POSITIVE', 'score': 0.9998}]
97
+ ```
98
+
99
+ For more than one sentence, pass a list of sentences to the [`pipeline`] which returns a list of dictionaries:
100
+
101
+ ```py
102
+ >>> results = classifier(["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."])
103
+ >>> for result in results:
104
+ ... print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
105
+ label: POSITIVE, with score: 0.9998
106
+ label: NEGATIVE, with score: 0.5309
107
+ ```
108
+
109
+ Die [`pipeline`] kann auch über einen ganzen Datensatz iterieren. Starten wir mit der Installation der [🤗 Datasets](https://huggingface.co/docs/datasets/) Bibliothek:
110
+
111
+ ```bash
112
+ pip install datasets
113
+ ```
114
+
115
+ Erstellen wir eine [`pipeline`] mit der Aufgabe die wir lösen und dem Modell welches wir nutzen möchten.
116
+
117
+ ```py
118
+ >>> import torch
119
+ >>> from transformers import pipeline
120
+
121
+ >>> speech_recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h")
122
+ ```
123
+
124
+ Als nächstes laden wir den Datensatz (siehe 🤗 Datasets [Quick Start](https://huggingface.co/docs/datasets/quickstart) für mehr Details) welches wir nutzen möchten. Zum Beispiel laden wir den [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) Datensatz:
125
+
126
+ ```py
127
+ >>> from datasets import load_dataset, Audio
128
+
129
+ >>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train") # doctest: +IGNORE_RESULT
130
+ ```
131
+
132
+ Wir müssen sicherstellen, dass die Abtastrate des Datensatzes der Abtastrate entspricht, mit der `facebook/wav2vec2-base-960h` trainiert wurde.
133
+
134
+ ```py
135
+ >>> dataset = dataset.cast_column("audio", Audio(sampling_rate=speech_recognizer.feature_extractor.sampling_rate))
136
+ ```
137
+
138
+ Audiodateien werden automatisch geladen und neu abgetastet, wenn die Spalte "audio" aufgerufen wird.
139
+ Extrahieren wir die rohen Wellenform-Arrays der ersten 4 Beispiele und übergeben wir sie als Liste an die Pipeline:
140
+
141
+ ```py
142
+ >>> result = speech_recognizer(dataset[:4]["audio"])
143
+ >>> print([d["text"] for d in result])
144
+ ['I WOULD LIKE TO SET UP A JOINT ACCOUNT WITH MY PARTNER HOW DO I PROCEED WITH DOING THAT', "FODING HOW I'D SET UP A JOIN TO HET WITH MY WIFE AND WHERE THE AP MIGHT BE", "I I'D LIKE TOY SET UP A JOINT ACCOUNT WITH MY PARTNER I'M NOT SEEING THE OPTION TO DO IT ON THE AP SO I CALLED IN TO GET SOME HELP CAN I JUST DO IT OVER THE PHONE WITH YOU AND GIVE YOU THE INFORMATION OR SHOULD I DO IT IN THE AP AND I'M MISSING SOMETHING UQUETTE HAD PREFERRED TO JUST DO IT OVER THE PHONE OF POSSIBLE THINGS", 'HOW DO I THURN A JOIN A COUNT']
145
+ ```
146
+
147
+ Bei einem größeren Datensatz mit vielen Eingaben (wie bei Sprache oder Bildverarbeitung) sollten Sie einen Generator anstelle einer Liste übergeben, der alle Eingaben in den Speicher lädt. Weitere Informationen finden Sie in der [Pipeline-Dokumentation](./main_classes/pipelines).
148
+
149
+ ### Ein anderes Modell und einen anderen Tokenizer in der Pipeline verwenden
150
+
151
+ Die [`pipeline`] kann jedes Modell aus dem [Model Hub](https://huggingface.co/models) verwenden, wodurch es einfach ist, die [`pipeline`] für andere Anwendungsfälle anzupassen. Wenn Sie beispielsweise ein Modell wünschen, das französischen Text verarbeiten kann, verwenden Sie die Tags im Model Hub, um nach einem geeigneten Modell zu filtern. Das oberste gefilterte Ergebnis liefert ein mehrsprachiges [BERT-Modell](https://huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment), das auf die Stimmungsanalyse abgestimmt ist. Großartig, verwenden wir dieses Modell!
152
+
153
+ ```py
154
+ >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
155
+ ```
156
+
157
+ <frameworkcontent>
158
+ <pt>
159
+ Use the [`AutoModelForSequenceClassification`] and [`AutoTokenizer`] to load the pretrained model and it's associated tokenizer (more on an `AutoClass` below):
160
+
161
+ ```py
162
+ >>> from transformers import AutoTokenizer, AutoModelForSequenceClassification
163
+
164
+ >>> model = AutoModelForSequenceClassification.from_pretrained(model_name)
165
+ >>> tokenizer = AutoTokenizer.from_pretrained(model_name)
166
+ ```
167
+ </pt>
168
+ <tf>
169
+ Use the [`TFAutoModelForSequenceClassification`] and [`AutoTokenizer`] to load the pretrained model and it's associated tokenizer (more on an `TFAutoClass` below):
170
+
171
+ ```py
172
+ >>> from transformers import AutoTokenizer, TFAutoModelForSequenceClassification
173
+
174
+ >>> model = TFAutoModelForSequenceClassification.from_pretrained(model_name)
175
+ >>> tokenizer = AutoTokenizer.from_pretrained(model_name)
176
+ ```
177
+ </tf>
178
+ </frameworkcontent>
179
+
180
+ Dann können Sie das Modell und den Tokenizer in der [`pipeline`] angeben und den `Klassifikator` auf Ihren Zieltext anwenden:
181
+
182
+ ```py
183
+ >>> classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
184
+ >>> classifier("Nous sommes très heureux de vous présenter la bibliothèque 🤗 Transformers.")
185
+ [{'label': '5 stars', 'score': 0.7273}]
186
+ ```
187
+
188
+ Wenn Sie kein Modell für Ihren Anwendungsfall finden können, müssen Sie ein vortrainiertes Modell auf Ihren Daten feinabstimmen. Schauen Sie sich unser [Feinabstimmungs-Tutorial](./training) an, um zu erfahren, wie das geht. Und schließlich, nachdem Sie Ihr trainiertes Modell verfeinert haben, sollten Sie es mit der Community im Model Hub teilen (siehe Tutorial [hier](./model_sharing)), um NLP für alle zu demokratisieren! 🤗
189
+
190
+ ## AutoClass
191
+
192
+ <Youtube id="AhChOFRegn4"/>
193
+
194
+ Unter der Haube arbeiten die Klassen [`AutoModelForSequenceClassification`] und [`AutoTokenizer`] zusammen, um die [`pipeline`] zu betreiben. Eine [`AutoClass`](./model_doc/auto) ist eine Abkürzung, die automatisch die Architektur eines trainierten Modells aus dessen Namen oder Pfad abruft. Sie müssen nur die passende `AutoClass` für Ihre Aufgabe und den zugehörigen Tokenizer mit [`AutoTokenizer`] auswählen.
195
+
196
+ Kehren wir zu unserem Beispiel zurück und sehen wir uns an, wie Sie die `AutoClass` verwenden können, um die Ergebnisse der [`pipeline`] zu replizieren.
197
+
198
+ ### AutoTokenizer
199
+
200
+ Ein Tokenizer ist für die Vorverarbeitung von Text in ein für das Modell verständliches Format zuständig. Zunächst zerlegt der Tokenisierer den Text in Wörter, die *Token* genannt werden. Es gibt mehrere Regeln für den Tokenisierungsprozess, z. B. wie und auf welcher Ebene ein Wort aufgespalten wird (weitere Informationen über Tokenisierung [hier](./tokenizer_summary)). Das Wichtigste ist jedoch, dass Sie den Tokenizer mit demselben Modellnamen instanziieren müssen, um sicherzustellen, dass Sie dieselben Tokenisierungsregeln verwenden, mit denen ein Modell zuvor trainiert wurde.
201
+ Laden sie einen Tokenizer mit [`AutoTokenizer`]:
202
+
203
+ ```py
204
+ >>> from transformers import AutoTokenizer
205
+
206
+ >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
207
+ >>> tokenizer = AutoTokenizer.from_pretrained(model_name)
208
+ ```
209
+
210
+ Anschließend wandelt der Tokenizer die Token in Zahlen um, um einen Tensor als Eingabe für das Modell zu konstruieren. Dieser wird als *Vokabular* des Modells bezeichnet.
211
+
212
+ Übergeben Sie Ihren Text an den Tokenizer:
213
+
214
+ ```py
215
+ >>> encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
216
+ >>> print(encoding)
217
+ {'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
218
+ 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
219
+ 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
220
+ ```
221
+
222
+ Der Tokenizer gibt ein Wörterbuch zurück, das Folgendes enthält:
223
+
224
+ * [input_ids](./glossary#input-ids): numerische Repräsentationen Ihrer Token.
225
+ * [atttention_mask](.glossary#attention-mask): gibt an, welche Token beachtet werden sollen.
226
+
227
+ Genau wie die [`pipeline`] akzeptiert der Tokenizer eine Liste von Eingaben. Darüber hinaus kann der Tokenizer den Text auch auffüllen und kürzen, um einen Stapel mit einheitlicher Länge zurückzugeben:
228
+
229
+ <frameworkcontent>
230
+ <pt>
231
+
232
+ ```py
233
+ >>> pt_batch = tokenizer(
234
+ ... ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
235
+ ... padding=True,
236
+ ... truncation=True,
237
+ ... max_length=512,
238
+ ... return_tensors="pt",
239
+ ... )
240
+ ```
241
+ </pt>
242
+ <tf>
243
+
244
+ ```py
245
+ >>> tf_batch = tokenizer(
246
+ ... ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
247
+ ... padding=True,
248
+ ... truncation=True,
249
+ ... max_length=512,
250
+ ... return_tensors="tf",
251
+ ... )
252
+ ```
253
+ </tf>
254
+ </frameworkcontent>
255
+
256
+ Lesen Sie das Tutorial [preprocessing](./preprocessing) für weitere Details zur Tokenisierung.
257
+
258
+ ### AutoModel
259
+
260
+ <frameworkcontent>
261
+ <pt>
262
+ 🤗 Transformers bietet eine einfache und einheitliche Möglichkeit, vortrainierte Instanzen zu laden. Das bedeutet, dass Sie ein [`AutoModel`] laden können, wie Sie einen [`AutoTokenizer`] laden würden. Der einzige Unterschied ist die Auswahl des richtigen [`AutoModel`] für die Aufgabe. Da Sie eine Text- oder Sequenzklassifizierung vornehmen, laden Sie [`AutoModelForSequenceClassification`]:
263
+
264
+ ```py
265
+ >>> from transformers import AutoModelForSequenceClassification
266
+
267
+ >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
268
+ >>> pt_model = AutoModelForSequenceClassification.from_pretrained(model_name)
269
+ ```
270
+
271
+ <Tip>
272
+
273
+ In der [Aufgabenzusammenfassung](./task_summary) steht, welche [AutoModel]-Klasse für welche Aufgabe zu verwenden ist.
274
+
275
+ </Tip>
276
+
277
+ Jetzt können Sie Ihren vorverarbeiteten Stapel von Eingaben direkt an das Modell übergeben. Sie müssen nur das Wörterbuch entpacken, indem Sie `**` hinzufügen:
278
+
279
+ ```py
280
+ >>> pt_outputs = pt_model(**pt_batch)
281
+ ```
282
+
283
+ Das Modell gibt die endgültigen Aktivierungen in dem Attribut "logits" aus. Wenden Sie die Softmax-Funktion auf die "logits" an, um die Wahrscheinlichkeiten zu erhalten:
284
+
285
+ ```py
286
+ >>> from torch import nn
287
+
288
+ >>> pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
289
+ >>> print(pt_predictions)
290
+ tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
291
+ [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=<SoftmaxBackward0>)
292
+ ```
293
+ </pt>
294
+ <tf>
295
+ 🤗 Transformers bietet eine einfache und einheitliche Methode zum Laden von vortrainierten Instanzen. Das bedeutet, dass Sie ein [`TFAutoModel`] genauso laden können, wie Sie einen [`AutoTokenizer`] laden würden. Der einzige Unterschied ist die Auswahl des richtigen [`TFAutoModel`] für die Aufgabe. Da Sie Text - oder Sequenz - Klassifizierung machen, laden Sie [`TFAutoModelForSequenceClassification`]:
296
+
297
+ ```py
298
+ >>> from transformers import TFAutoModelForSequenceClassification
299
+
300
+ >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
301
+ >>> tf_model = TFAutoModelForSequenceClassification.from_pretrained(model_name)
302
+ ```
303
+
304
+ <Tip>
305
+
306
+ In der [Aufgabenzusammenfassung](./task_summary) steht, welche [AutoModel]-Klasse für welche Aufgabe zu verwenden ist.
307
+
308
+ </Tip>
309
+
310
+ Jetzt können Sie Ihren vorverarbeiteten Stapel von Eingaben direkt an das Modell übergeben, indem Sie die Wörterbuchschlüssel direkt an die Tensoren übergeben:
311
+
312
+ ```py
313
+ >>> tf_outputs = tf_model(tf_batch)
314
+ ```
315
+
316
+ Das Modell gibt die endgültigen Aktivierungen in dem Attribut "logits" aus. Wenden Sie die Softmax-Funktion auf die "logits" an, um die Wahrscheinlichkeiten zu erhalten:
317
+
318
+ ```py
319
+ >>> import tensorflow as tf
320
+
321
+ >>> tf_predictions = tf.nn.softmax(tf_outputs.logits, axis=-1)
322
+ >>> tf_predictions # doctest: +IGNORE_RESULT
323
+ ```
324
+ </tf>
325
+ </frameworkcontent>
326
+
327
+ <Tip>
328
+
329
+ Alle 🤗 Transformers-Modelle (PyTorch oder TensorFlow) geben die Tensoren *vor* der endgültigen Aktivierungsfunktion
330
+ Funktion (wie Softmax) aus, da die endgültige Aktivierungsfunktion oft mit dem Verlusten verschmolzen ist.
331
+
332
+ </Tip>
333
+
334
+ Modelle sind ein standardmäßiges [`torch.nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) oder ein [`tf.keras.Model`](https://www.tensorflow.org/api_docs/python/tf/keras/Model), sodass Sie sie in Ihrer üblichen Trainingsschleife verwenden können. Um jedoch die Dinge einfacher zu machen, bietet 🤗 Transformers eine [`Trainer`]-Klasse für PyTorch, die Funktionalität für verteiltes Training, gemischte Präzision und mehr bietet. Für TensorFlow können Sie die Methode `fit` aus [Keras](https://keras.io/) verwenden. Siehe das [training tutorial](./training) für weitere Details.
335
+
336
+ <Tip>
337
+
338
+ Transformers-Modellausgaben sind spezielle Datenklassen, so dass ihre Attribute in einer IDE automatisch vervollständigt werden.
339
+ Die Modellausgänge verhalten sich auch wie ein Tupel oder ein Wörterbuch (z.B. können Sie mit einem Integer, einem Slice oder einem String indexieren), wobei die Attribute, die "None" sind, ignoriert werden.
340
+
341
+ </Tip>
342
+
343
+ ### Modell speichern
344
+
345
+ <frameworkcontent>
346
+ <pt>
347
+ Sobald Ihr Modell feinabgestimmt ist, können Sie es mit seinem Tokenizer speichern, indem Sie [`PreTrainedModel.save_pretrained`] verwenden:
348
+
349
+ ```py
350
+ >>> pt_save_directory = "./pt_save_pretrained"
351
+ >>> tokenizer.save_pretrained(pt_save_directory) # doctest: +IGNORE_RESULT
352
+ >>> pt_model.save_pretrained(pt_save_directory)
353
+ ```
354
+
355
+ Wenn Sie bereit sind, das Modell erneut zu verwenden, laden Sie es mit [`PreTrainedModel.from_pretrained`]:
356
+
357
+ ```py
358
+ >>> pt_model = AutoModelForSequenceClassification.from_pretrained("./pt_save_pretrained")
359
+ ```
360
+ </pt>
361
+ <tf>
362
+ Sobald Ihr Modell feinabgestimmt ist, können Sie es mit seinem Tokenizer unter Verwendung von [`TFPreTrainedModel.save_pretrained`] speichern:
363
+
364
+ ```py
365
+ >>> tf_save_directory = "./tf_save_pretrained"
366
+ >>> tokenizer.save_pretrained(tf_save_directory) # doctest: +IGNORE_RESULT
367
+ >>> tf_model.save_pretrained(tf_save_directory)
368
+ ```
369
+
370
+ Wenn Sie bereit sind, das Modell wieder zu verwenden, laden Sie es mit [`TFPreTrainedModel.from_pretrained`]:
371
+
372
+ ```py
373
+ >>> tf_model = TFAutoModelForSequenceClassification.from_pretrained("./tf_save_pretrained")
374
+ ```
375
+ </tf>
376
+ </frameworkcontent>
377
+
378
+ Ein besonders cooles 🤗 Transformers-Feature ist die Möglichkeit, ein Modell zu speichern und es entweder als PyTorch- oder TensorFlow-Modell wieder zu laden. Der Parameter "from_pt" oder "from_tf" kann das Modell von einem Framework in das andere konvertieren:
379
+
380
+ <frameworkcontent>
381
+ <pt>
382
+
383
+ ```py
384
+ >>> from transformers import AutoModel
385
+
386
+ >>> tokenizer = AutoTokenizer.from_pretrained(tf_save_directory)
387
+ >>> pt_model = AutoModelForSequenceClassification.from_pretrained(tf_save_directory, from_tf=True)
388
+ ```
389
+ </pt>
390
+ <tf>
391
+
392
+ ```py
393
+ >>> from transformers import TFAutoModel
394
+
395
+ >>> tokenizer = AutoTokenizer.from_pretrained(pt_save_directory)
396
+ >>> tf_model = TFAutoModelForSequenceClassification.from_pretrained(pt_save_directory, from_pt=True)
397
+ ```
398
+ </tf>
399
+ </frameworkcontent>
400
+
401
+ ## Custom model builds
402
+
403
+ Sie können die Konfigurationsklasse des Modells ändern, um zu bestimmen, wie ein Modell aufgebaut ist. Die Konfiguration legt die Attribute eines Modells fest, z. B. die Anzahl der verborgenen Schichten oder der Aufmerksamkeitsköpfe. Wenn Sie ein Modell aus einer benutzerdefinierten Konfigurationsklasse initialisieren, beginnen Sie bei Null. Die Modellattribute werden zufällig initialisiert, und Sie müssen das Modell trainieren, bevor Sie es verwenden können, um aussagekräftige Ergebnisse zu erhalten.
404
+
405
+ Beginnen Sie mit dem Import von [`AutoConfig`] und laden Sie dann das trainierte Modell, das Sie ändern möchten. Innerhalb von [`AutoConfig.from_pretrained`] können Sie das Attribut angeben, das Sie ändern möchten, z. B. die Anzahl der Aufmerksamkeitsköpfe:
406
+
407
+ ```py
408
+ >>> from transformers import AutoConfig
409
+
410
+ >>> my_config = AutoConfig.from_pretrained("distilbert/distilbert-base-uncased", n_heads=12)
411
+ ```
412
+
413
+ <frameworkcontent>
414
+ <pt>
415
+ Create a model from your custom configuration with [`AutoModel.from_config`]:
416
+
417
+ ```py
418
+ >>> from transformers import AutoModel
419
+
420
+ >>> my_model = AutoModel.from_config(my_config)
421
+ ```
422
+ </pt>
423
+ <tf>
424
+ Create a model from your custom configuration with [`TFAutoModel.from_config`]:
425
+
426
+ ```py
427
+ >>> from transformers import TFAutoModel
428
+
429
+ >>> my_model = TFAutoModel.from_config(my_config)
430
+ ```
431
+ </tf>
432
+ </frameworkcontent>
433
+
434
+ Weitere Informationen zur Erstellung von benutzerdefinierten Konfigurationen finden Sie in der Anleitung [Erstellen einer benutzerdefinierten Architektur](./create_a_model).
435
+
436
+ ## Wie geht es weiter?
437
+
438
+ Nachdem Sie nun die 🤗 Transformers-Kurztour abgeschlossen haben, schauen Sie sich unsere Anleitungen an und erfahren Sie, wie Sie spezifischere Dinge tun können, wie das Schreiben eines benutzerdefinierten Modells, die Feinabstimmung eines Modells für eine Aufgabe und wie man ein Modell mit einem Skript trainiert. Wenn Sie mehr über die Kernkonzepte von 🤗 Transformers erfahren möchten, nehmen Sie sich eine Tasse Kaffee und werfen Sie einen Blick auf unsere konzeptionellen Leitfäden!
docs/source/de/run_scripts.md ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Trainieren mit einem Skript
18
+
19
+ Neben den 🤗 Transformers [notebooks](./noteboks/README) gibt es auch Beispielskripte, die zeigen, wie man ein Modell für eine Aufgabe mit [PyTorch](https://github.com/huggingface/transformers/tree/main/examples/pytorch), [TensorFlow](https://github.com/huggingface/transformers/tree/main/examples/tensorflow) oder [JAX/Flax](https://github.com/huggingface/transformers/tree/main/examples/flax) trainiert.
20
+
21
+ Sie werden auch Skripte finden, die wir in unseren [Forschungsprojekten](https://github.com/huggingface/transformers/tree/main/examples/research_projects) und [Legacy-Beispielen](https://github.com/huggingface/transformers/tree/main/examples/legacy) verwendet haben und die größtenteils von der Community stammen. Diese Skripte werden nicht aktiv gepflegt und erfordern eine bestimmte Version von 🤗 Transformers, die höchstwahrscheinlich nicht mit der neuesten Version der Bibliothek kompatibel ist.
22
+
23
+ Es wird nicht erwartet, dass die Beispielskripte bei jedem Problem sofort funktionieren. Möglicherweise müssen Sie das Skript an das Problem anpassen, das Sie zu lösen versuchen. Um Ihnen dabei zu helfen, legen die meisten Skripte vollständig offen, wie die Daten vorverarbeitet werden, so dass Sie sie nach Bedarf für Ihren Anwendungsfall bearbeiten können.
24
+
25
+ Für jede Funktion, die Sie in einem Beispielskript implementieren möchten, diskutieren Sie bitte im [Forum](https://discuss.huggingface.co/) oder in einem [issue](https://github.com/huggingface/transformers/issues), bevor Sie einen Pull Request einreichen. Wir freuen uns zwar über Fehlerkorrekturen, aber es ist unwahrscheinlich, dass wir einen Pull Request zusammenführen, der mehr Funktionalität auf Kosten der Lesbarkeit hinzufügt.
26
+
27
+ Diese Anleitung zeigt Ihnen, wie Sie ein Beispiel für ein Trainingsskript zur Zusammenfassung in [PyTorch](https://github.com/huggingface/transformers/tree/main/examples/pytorch/summarization) und [TensorFlow](https://github.com/huggingface/transformers/tree/main/examples/tensorflow/summarization) ausführen können. Sofern nicht anders angegeben, sollten alle Beispiele mit beiden Frameworks funktionieren.
28
+
29
+ ## Einrichtung
30
+
31
+ Um die neueste Version der Beispielskripte erfolgreich auszuführen, **müssen Sie 🤗 Transformers aus dem Quellcode** in einer neuen virtuellen Umgebung installieren:
32
+
33
+ ```bash
34
+ git clone https://github.com/huggingface/transformers
35
+ cd transformers
36
+ pip install .
37
+ ```
38
+
39
+ Für ältere Versionen der Beispielskripte klicken Sie auf die Umschalttaste unten:
40
+
41
+ <details>
42
+ <summary>Beispiele für ältere Versionen von 🤗 Transformers</summary>
43
+ <ul>
44
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.5.1/examples">v4.5.1</a></li>
45
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.4.2/examples">v4.4.2</a></li>
46
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.3.3/examples">v4.3.3</a></li>
47
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.2.2/examples">v4.2.2</a></li>
48
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.1.1/examples">v4.1.1</a></li>
49
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.0.1/examples">v4.0.1</a></li>
50
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.5.1/examples">v3.5.1</a></li>
51
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.4.0/examples">v3.4.0</a></li>
52
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.3.1/examples">v3.3.1</a></li>
53
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.2.0/examples">v3.2.0</a></li>
54
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.1.0/examples">v3.1.0</a></li>
55
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.0.2/examples">v3.0.2</a></li>
56
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.11.0/examples">v2.11.0</a></li>
57
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.10.0/examples">v2.10.0</a></li>
58
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.9.1/examples">v2.9.1</a></li>
59
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.8.0/examples">v2.8.0</a></li>
60
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.7.0/examples">v2.7.0</a></li>
61
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.6.0/examples">v2.6.0</a></li>
62
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.5.1/examples">v2.5.1</a></li>
63
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.4.0/examples">v2.4.0</a></li>
64
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.3.0/examples">v2.3.0</a></li>
65
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.2.0/examples">v2.2.0</a></li>
66
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.1.0/examples">v2.1.1</a></li>
67
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.0.0/examples">v2.0.0</a></li>
68
+ <li><a href="https://github.com/huggingface/transformers/tree/v1.2.0/examples">v1.2.0</a></li>
69
+ <li><a href="https://github.com/huggingface/transformers/tree/v1.1.0/examples">v1.1.0</a></li>
70
+ <li><a href="https://github.com/huggingface/transformers/tree/v1.0.0/examples">v1.0.0</a></li>
71
+ </ul>
72
+ </details>
73
+
74
+ Dann stellen Sie Ihren aktuellen Klon von 🤗 Transformers auf eine bestimmte Version um, z.B. v3.5.1:
75
+
76
+ ```bash
77
+ git checkout tags/v3.5.1
78
+ ```
79
+
80
+ Nachdem Sie die richtige Bibliotheksversion eingerichtet haben, navigieren Sie zu dem Beispielordner Ihrer Wahl und installieren die beispielspezifischen Anforderungen:
81
+
82
+ ```bash
83
+ pip install -r requirements.txt
84
+ ```
85
+
86
+ ## Ein Skript ausführen
87
+
88
+ <frameworkcontent>
89
+ <pt>
90
+ Das Beispielskript lädt einen Datensatz aus der 🤗 [Datasets](https://huggingface.co/docs/datasets/) Bibliothek herunter und verarbeitet ihn vor. Dann nimmt das Skript eine Feinabstimmung eines Datensatzes mit dem [Trainer](https://huggingface.co/docs/transformers/main_classes/trainer) auf einer Architektur vor, die eine Zusammenfassung unterstützt. Das folgende Beispiel zeigt, wie die Feinabstimmung von [T5-small](https://huggingface.co/google-t5/t5-small) auf dem Datensatz [CNN/DailyMail](https://huggingface.co/datasets/cnn_dailymail) durchgeführt wird. Das T5-Modell benötigt aufgrund der Art und Weise, wie es trainiert wurde, ein zusätzliches Argument `source_prefix`. Mit dieser Eingabeaufforderung weiß T5, dass es sich um eine Zusammenfassungsaufgabe handelt.
91
+
92
+ ```bash
93
+ python examples/pytorch/summarization/run_summarization.py \
94
+ --model_name_or_path google-t5/t5-small \
95
+ --do_train \
96
+ --do_eval \
97
+ --dataset_name cnn_dailymail \
98
+ --dataset_config "3.0.0" \
99
+ --source_prefix "summarize: " \
100
+ --output_dir /tmp/tst-summarization \
101
+ --per_device_train_batch_size=4 \
102
+ --per_device_eval_batch_size=4 \
103
+ --overwrite_output_dir \
104
+ --predict_with_generate
105
+ ```
106
+ </pt>
107
+ <tf>
108
+ Das Beispielskript lädt einen Datensatz aus der 🤗 [Datasets](https://huggingface.co/docs/datasets/) Bibliothek herunter und verarbeitet ihn vor. Anschließend nimmt das Skript die Feinabstimmung eines Datensatzes mit Keras auf einer Architektur vor, die die Zusammenfassung unterstützt. Das folgende Beispiel zeigt, wie die Feinabstimmung von [T5-small](https://huggingface.co/google-t5/t5-small) auf dem [CNN/DailyMail](https://huggingface.co/datasets/cnn_dailymail) Datensatz durchgeführt wird. Das T5-Modell benötigt aufgrund der Art und Weise, wie es trainiert wurde, ein zusätzliches Argument `source_prefix`. Mit dieser Eingabeaufforderung weiß T5, dass es sich um eine Zusammenfassungsaufgabe handelt.
109
+
110
+ ```bash
111
+ python examples/tensorflow/summarization/run_summarization.py \
112
+ --model_name_or_path google-t5/t5-small \
113
+ --dataset_name cnn_dailymail \
114
+ --dataset_config "3.0.0" \
115
+ --output_dir /tmp/tst-summarization \
116
+ --per_device_train_batch_size 8 \
117
+ --per_device_eval_batch_size 16 \
118
+ --num_train_epochs 3 \
119
+ --do_train \
120
+ --do_eval
121
+ ```
122
+ </tf>
123
+ </frameworkcontent>
124
+
125
+ ## Verteiltes Training und gemischte Präzision
126
+
127
+ Der [Trainer](https://huggingface.co/docs/transformers/main_classes/trainer) unterstützt verteiltes Training und gemischte Präzision, d.h. Sie können ihn auch in einem Skript verwenden. So aktivieren Sie diese beiden Funktionen:
128
+
129
+ - Fügen Sie das Argument `fp16` hinzu, um gemischte Genauigkeit zu aktivieren.
130
+ - Legen Sie die Anzahl der zu verwendenden GPUs mit dem Argument `nproc_per_node` fest.
131
+
132
+ ```bash
133
+ torchrun \
134
+ --nproc_per_node 8 pytorch/summarization/run_summarization.py \
135
+ --fp16 \
136
+ --model_name_or_path google-t5/t5-small \
137
+ --do_train \
138
+ --do_eval \
139
+ --dataset_name cnn_dailymail \
140
+ --dataset_config "3.0.0" \
141
+ --source_prefix "summarize: " \
142
+ --output_dir /tmp/tst-summarization \
143
+ --per_device_train_batch_size=4 \
144
+ --per_device_eval_batch_size=4 \
145
+ --overwrite_output_dir \
146
+ --predict_with_generate
147
+ ```
148
+
149
+ TensorFlow-Skripte verwenden eine [`MirroredStrategy`](https://www.tensorflow.org/guide/distributed_training#mirroredstrategy) für verteiltes Training, und Sie müssen dem Trainingsskript keine zusätzlichen Argumente hinzufügen. Das TensorFlow-Skript verwendet standardmäßig mehrere GPUs, wenn diese verfügbar sind.
150
+
151
+ ## Ein Skript auf einer TPU ausführen
152
+
153
+ <frameworkcontent>
154
+ <pt>
155
+ Tensor Processing Units (TPUs) sind speziell für die Beschleunigung der Leistung konzipiert. PyTorch unterstützt TPUs mit dem [XLA](https://www.tensorflow.org/xla) Deep Learning Compiler (siehe [hier](https://github.com/pytorch/xla/blob/master/README.md) für weitere Details). Um eine TPU zu verwenden, starten Sie das Skript `xla_spawn.py` und verwenden das Argument `num_cores`, um die Anzahl der TPU-Kerne festzulegen, die Sie verwenden möchten.
156
+
157
+ ```bash
158
+ python xla_spawn.py --num_cores 8 \
159
+ summarization/run_summarization.py \
160
+ --model_name_or_path google-t5/t5-small \
161
+ --do_train \
162
+ --do_eval \
163
+ --dataset_name cnn_dailymail \
164
+ --dataset_config "3.0.0" \
165
+ --source_prefix "summarize: " \
166
+ --output_dir /tmp/tst-summarization \
167
+ --per_device_train_batch_size=4 \
168
+ --per_device_eval_batch_size=4 \
169
+ --overwrite_output_dir \
170
+ --predict_with_generate
171
+ ```
172
+ </pt>
173
+ <tf>
174
+ Tensor Processing Units (TPUs) sind speziell für die Beschleunigung der Leistung konzipiert. TensorFlow Skripte verwenden eine [`TPUStrategy`](https://www.tensorflow.org/guide/distributed_training#tpustrategy) für das Training auf TPUs. Um eine TPU zu verwenden, übergeben Sie den Namen der TPU-Ressource an das Argument `tpu`.
175
+
176
+ ```bash
177
+ python run_summarization.py \
178
+ --tpu name_of_tpu_resource \
179
+ --model_name_or_path google-t5/t5-small \
180
+ --dataset_name cnn_dailymail \
181
+ --dataset_config "3.0.0" \
182
+ --output_dir /tmp/tst-summarization \
183
+ --per_device_train_batch_size 8 \
184
+ --per_device_eval_batch_size 16 \
185
+ --num_train_epochs 3 \
186
+ --do_train \
187
+ --do_eval
188
+ ```
189
+ </tf>
190
+ </frameworkcontent>
191
+
192
+ ## Führen Sie ein Skript mit 🤗 Accelerate aus.
193
+
194
+ 🤗 [Accelerate](https://huggingface.co/docs/accelerate) ist eine reine PyTorch-Bibliothek, die eine einheitliche Methode für das Training eines Modells auf verschiedenen Arten von Setups (nur CPU, mehrere GPUs, TPUs) bietet und dabei die vollständige Transparenz der PyTorch-Trainingsschleife beibehält. Stellen Sie sicher, dass Sie 🤗 Accelerate installiert haben, wenn Sie es nicht bereits haben:
195
+
196
+ > Hinweis: Da Accelerate schnell weiterentwickelt wird, muss die Git-Version von Accelerate installiert sein, um die Skripte auszuführen.
197
+ ```bash
198
+ pip install git+https://github.com/huggingface/accelerate
199
+ ```
200
+
201
+ Anstelle des Skripts `run_summarization.py` müssen Sie das Skript `run_summarization_no_trainer.py` verwenden. Die von Accelerate unterstützten Skripte haben eine Datei `task_no_trainer.py` im Ordner. Beginnen Sie mit dem folgenden Befehl, um eine Konfigurationsdatei zu erstellen und zu speichern:
202
+
203
+ ```bash
204
+ accelerate config
205
+ ```
206
+
207
+ Testen Sie Ihre Einrichtung, um sicherzustellen, dass sie korrekt konfiguriert ist:
208
+
209
+ ```bash
210
+ accelerate test
211
+ ```
212
+
213
+ Jetzt sind Sie bereit, das Training zu starten:
214
+
215
+ ```bash
216
+ accelerate launch run_summarization_no_trainer.py \
217
+ --model_name_or_path google-t5/t5-small \
218
+ --dataset_name cnn_dailymail \
219
+ --dataset_config "3.0.0" \
220
+ --source_prefix "summarize: " \
221
+ --output_dir ~/tmp/tst-summarization
222
+ ```
223
+
224
+ ## Verwenden Sie einen benutzerdefinierten Datensatz
225
+
226
+ Das Verdichtungsskript unterstützt benutzerdefinierte Datensätze, solange es sich um eine CSV- oder JSON-Line-Datei handelt. Wenn Sie Ihren eigenen Datensatz verwenden, müssen Sie mehrere zusätzliche Argumente angeben:
227
+
228
+ - `train_file` und `validation_file` geben den Pfad zu Ihren Trainings- und Validierungsdateien an.
229
+ - `text_column` ist der Eingabetext, der zusammengefasst werden soll.
230
+ - Summary_column" ist der auszugebende Zieltext.
231
+
232
+ Ein Zusammenfassungsskript, das einen benutzerdefinierten Datensatz verwendet, würde wie folgt aussehen:
233
+
234
+ ```bash
235
+ python examples/pytorch/summarization/run_summarization.py \
236
+ --model_name_or_path google-t5/t5-small \
237
+ --do_train \
238
+ --do_eval \
239
+ --train_file path_to_csv_or_jsonlines_file \
240
+ --validation_file path_to_csv_or_jsonlines_file \
241
+ --text_column text_column_name \
242
+ --summary_column summary_column_name \
243
+ --source_prefix "summarize: " \
244
+ --output_dir /tmp/tst-summarization \
245
+ --overwrite_output_dir \
246
+ --per_device_train_batch_size=4 \
247
+ --per_device_eval_batch_size=4 \
248
+ --predict_with_generate
249
+ ```
250
+
251
+ ## Testen Sie ein Skript
252
+
253
+ Es ist oft eine gute Idee, Ihr Skript an einer kleineren Anzahl von Beispielen für Datensätze auszuführen, um sicherzustellen, dass alles wie erwartet funktioniert, bevor Sie sich auf einen ganzen Datensatz festlegen, dessen Fertigstellung Stunden dauern kann. Verwenden Sie die folgenden Argumente, um den Datensatz auf eine maximale Anzahl von Stichproben zu beschränken:
254
+
255
+ - `max_train_samples`
256
+ - `max_eval_samples`
257
+ - `max_predict_samples`
258
+
259
+ ```bash
260
+ python examples/pytorch/summarization/run_summarization.py \
261
+ --model_name_or_path google-t5/t5-small \
262
+ --max_train_samples 50 \
263
+ --max_eval_samples 50 \
264
+ --max_predict_samples 50 \
265
+ --do_train \
266
+ --do_eval \
267
+ --dataset_name cnn_dailymail \
268
+ --dataset_config "3.0.0" \
269
+ --source_prefix "summarize: " \
270
+ --output_dir /tmp/tst-summarization \
271
+ --per_device_train_batch_size=4 \
272
+ --per_device_eval_batch_size=4 \
273
+ --overwrite_output_dir \
274
+ --predict_with_generate
275
+ ```
276
+
277
+ Nicht alle Beispielskripte unterstützen das Argument `max_predict_samples`. Wenn Sie sich nicht sicher sind, ob Ihr Skript dieses Argument unterstützt, fügen Sie das Argument `-h` hinzu, um dies zu überprüfen:
278
+
279
+ ```bash
280
+ examples/pytorch/summarization/run_summarization.py -h
281
+ ```
282
+
283
+ ## Training vom Kontrollpunkt fortsetzen
284
+
285
+ Eine weitere hilfreiche Option, die Sie aktivieren können, ist die Wiederaufnahme des Trainings von einem früheren Kontrollpunkt aus. Auf diese Weise können Sie im Falle einer Unterbrechung Ihres Trainings dort weitermachen, wo Sie aufgehört haben, ohne von vorne beginnen zu müssen. Es gibt zwei Methoden, um das Training von einem Kontrollpunkt aus wieder aufzunehmen.
286
+
287
+ Die erste Methode verwendet das Argument `output_dir previous_output_dir`, um das Training ab dem letzten in `output_dir` gespeicherten Kontrollpunkt wieder aufzunehmen. In diesem Fall sollten Sie `overwrite_output_dir` entfernen:
288
+
289
+ ```bash
290
+ python examples/pytorch/summarization/run_summarization.py
291
+ --model_name_or_path google-t5/t5-small \
292
+ --do_train \
293
+ --do_eval \
294
+ --dataset_name cnn_dailymail \
295
+ --dataset_config "3.0.0" \
296
+ --source_prefix "summarize: " \
297
+ --output_dir /tmp/tst-summarization \
298
+ --per_device_train_batch_size=4 \
299
+ --per_device_eval_batch_size=4 \
300
+ --output_dir previous_output_dir \
301
+ --predict_with_generate
302
+ ```
303
+
304
+ Die zweite Methode verwendet das Argument `Resume_from_checkpoint path_to_specific_checkpoint`, um das Training ab einem bestimmten Checkpoint-Ordner wieder aufzunehmen.
305
+
306
+ ```bash
307
+ python examples/pytorch/summarization/run_summarization.py
308
+ --model_name_or_path google-t5/t5-small \
309
+ --do_train \
310
+ --do_eval \
311
+ --dataset_name cnn_dailymail \
312
+ --dataset_config "3.0.0" \
313
+ --source_prefix "summarize: " \
314
+ --output_dir /tmp/tst-summarization \
315
+ --per_device_train_batch_size=4 \
316
+ --per_device_eval_batch_size=4 \
317
+ --overwrite_output_dir \
318
+ --resume_from_checkpoint path_to_specific_checkpoint \
319
+ --predict_with_generate
320
+ ```
321
+
322
+ ## Teilen Sie Ihr Modell
323
+
324
+ Alle Skripte können Ihr endgültiges Modell in den [Model Hub](https://huggingface.co/models) hochladen. Stellen Sie sicher, dass Sie bei Hugging Face angemeldet sind, bevor Sie beginnen:
325
+
326
+ ```bash
327
+ huggingface-cli login
328
+ ```
329
+
330
+ Dann fügen Sie dem Skript das Argument `push_to_hub` hinzu. Mit diesem Argument wird ein Repository mit Ihrem Hugging Face-Benutzernamen und dem in `output_dir` angegebenen Ordnernamen erstellt.
331
+
332
+ Wenn Sie Ihrem Repository einen bestimmten Namen geben möchten, fügen Sie ihn mit dem Argument `push_to_hub_model_id` hinzu. Das Repository wird automatisch unter Ihrem Namensraum aufgeführt.
333
+
334
+ Das folgende Beispiel zeigt, wie Sie ein Modell mit einem bestimmten Repository-Namen hochladen können:
335
+
336
+ ```bash
337
+ python examples/pytorch/summarization/run_summarization.py
338
+ --model_name_or_path google-t5/t5-small \
339
+ --do_train \
340
+ --do_eval \
341
+ --dataset_name cnn_dailymail \
342
+ --dataset_config "3.0.0" \
343
+ --source_prefix "summarize: " \
344
+ --push_to_hub \
345
+ --push_to_hub_model_id finetuned-t5-cnn_dailymail \
346
+ --output_dir /tmp/tst-summarization \
347
+ --per_device_train_batch_size=4 \
348
+ --per_device_eval_batch_size=4 \
349
+ --overwrite_output_dir \
350
+ --predict_with_generate
351
+ ```
docs/source/de/testing.md ADDED
@@ -0,0 +1,1293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Testen
18
+
19
+
20
+ Werfen wir einen Blick darauf, wie 🤗 Transformers-Modelle getestet werden und wie Sie neue Tests schreiben und die vorhandenen verbessern können.
21
+
22
+ Es gibt 2 Testsuiten im Repository:
23
+
24
+ 1. `tests` -- Tests für die allgemeine API
25
+ 2. `examples` -- Tests hauptsächlich für verschiedene Anwendungen, die nicht Teil der API sind
26
+
27
+ ## Wie Transformatoren getestet werden
28
+
29
+ 1. Sobald ein PR eingereicht wurde, wird er mit 9 CircleCi Jobs getestet. Jeder neue Commit zu diesem PR wird erneut getestet. Diese Aufträge
30
+ sind in dieser [Konfigurationsdatei](https://github.com/huggingface/transformers/tree/main/.circleci/config.yml) definiert, so dass Sie bei Bedarf die gleiche Umgebung auf Ihrem Rechner reproduzieren können.
31
+ Umgebung auf Ihrem Rechner reproduzieren können.
32
+
33
+ Diese CI-Jobs führen keine `@slow`-Tests durch.
34
+
35
+ 2. Es gibt 3 Jobs, die von [github actions](https://github.com/huggingface/transformers/actions) ausgeführt werden:
36
+
37
+ - [torch hub integration](https://github.com/huggingface/transformers/tree/main/.github/workflows/github-torch-hub.yml): prüft, ob die torch hub
38
+ Integration funktioniert.
39
+
40
+ - [self-hosted (push)](https://github.com/huggingface/transformers/tree/main/.github/workflows/self-push.yml): führt schnelle Tests auf der GPU nur bei Commits auf
41
+ `main`. Es wird nur ausgeführt, wenn ein Commit auf `main` den Code in einem der folgenden Ordner aktualisiert hat: `src`,
42
+ `tests`, `.github` (um zu verhindern, dass er auf hinzugefügten Modellkarten, Notebooks usw. läuft)
43
+
44
+ - [self-hosted runner](https://github.com/huggingface/transformers/tree/main/.github/workflows/self-scheduled.yml): führt normale und langsame Tests auf GPU in
45
+ `tests` und `examples`:
46
+
47
+ ```bash
48
+ RUN_SLOW=1 pytest tests/
49
+ RUN_SLOW=1 pytest examples/
50
+ ```
51
+
52
+ Die Ergebnisse können Sie [hier](https://github.com/huggingface/transformers/actions) sehen.
53
+
54
+
55
+
56
+ ## Tests ausführen
57
+
58
+
59
+
60
+
61
+
62
+ ### Auswahl der auszuführenden Tests
63
+
64
+ In diesem Dokument wird ausführlich erläutert, wie Tests ausgeführt werden können. Wenn Sie nach der Lektüre noch mehr Details benötigen
65
+ finden Sie diese [hier](https://docs.pytest.org/en/latest/usage.html).
66
+
67
+ Hier sind einige der nützlichsten Möglichkeiten, Tests auszuführen.
68
+
69
+ Alle ausführen:
70
+
71
+ ```console
72
+ pytest
73
+ ```
74
+
75
+ oder:
76
+
77
+ ```bash
78
+ make test
79
+ ```
80
+
81
+ Beachten Sie, dass Letzteres wie folgt definiert ist:
82
+
83
+ ```bash
84
+ python -m pytest -n auto --dist=loadfile -s -v ./tests/
85
+ ```
86
+
87
+ was pytest anweist:
88
+
89
+ - so viele Testprozesse laufen zu lassen, wie es CPU-Kerne gibt (was zu viele sein könnten, wenn Sie nicht über eine Menge RAM verfügen!)
90
+ - sicherzustellen, dass alle Tests aus derselben Datei von demselben Testprozess ausgeführt werden
91
+ - Erfassen Sie keine Ausgaben
92
+ - im ausführlichen Modus laufen lassen
93
+
94
+
95
+
96
+ ### Abrufen der Liste aller Tests
97
+
98
+ Alle Tests der Testsuite:
99
+
100
+ ```bash
101
+ pytest --collect-only -q
102
+ ```
103
+
104
+ Alle Tests einer bestimmten Testdatei:
105
+
106
+ ```bash
107
+ pytest tests/test_optimization.py --collect-only -q
108
+ ```
109
+
110
+ ### Führen Sie ein bestimmtes Testmodul aus
111
+
112
+ Um ein einzelnes Testmodul auszuführen:
113
+
114
+ ```bash
115
+ pytest tests/utils/test_logging.py
116
+ ```
117
+
118
+ ### Spezifische Tests ausführen
119
+
120
+ Da unittest in den meisten Tests verwendet wird, müssen Sie, um bestimmte Untertests auszuführen, den Namen der unittest
121
+ Klasse, die diese Tests enthält. Er könnte zum Beispiel lauten:
122
+
123
+ ```bash
124
+ pytest tests/test_optimization.py::OptimizationTest::test_adam_w
125
+ ```
126
+
127
+ Hier:
128
+
129
+ - `tests/test_optimization.py` - die Datei mit den Tests
130
+ - `OptimizationTest` - der Name der Klasse
131
+ - `test_adam_w` - der Name der spezifischen Testfunktion
132
+
133
+ Wenn die Datei mehrere Klassen enthält, können Sie auswählen, dass nur die Tests einer bestimmten Klasse ausgeführt werden sollen. Zum Beispiel:
134
+
135
+ ```bash
136
+ pytest tests/test_optimization.py::OptimizationTest
137
+ ```
138
+
139
+ führt alle Tests innerhalb dieser Klasse aus.
140
+
141
+ Wie bereits erwähnt, können Sie sehen, welche Tests in der Klasse `OptimizationTest` enthalten sind, indem Sie sie ausführen:
142
+
143
+ ```bash
144
+ pytest tests/test_optimization.py::OptimizationTest --collect-only -q
145
+ ```
146
+
147
+ Sie können Tests mit Hilfe von Schlüsselwortausdrücken ausführen.
148
+
149
+ Um nur Tests auszuführen, deren Name `adam` enthält:
150
+
151
+ ```bash
152
+ pytest -k adam tests/test_optimization.py
153
+ ```
154
+
155
+ Die logischen `und` und `oder` können verwendet werden, um anzugeben, ob alle Schlüsselwörter übereinstimmen sollen oder nur eines. `nicht` kann verwendet werden, um
156
+ negieren.
157
+
158
+ Um alle Tests auszuführen, außer denen, deren Name `adam` enthält:
159
+
160
+ ```bash
161
+ pytest -k "not adam" tests/test_optimization.py
162
+ ```
163
+
164
+ Und Sie können die beiden Muster in einem kombinieren:
165
+
166
+ ```bash
167
+ pytest -k "ada and not adam" tests/test_optimization.py
168
+ ```
169
+
170
+ Um zum Beispiel sowohl `test_adafactor` als auch `test_adam_w` auszuführen, können Sie verwenden:
171
+
172
+ ```bash
173
+ pytest -k "test_adam_w or test_adam_w" tests/test_optimization.py
174
+ ```
175
+
176
+ Beachten Sie, dass wir hier `oder` verwenden, da wir wollen, dass eines der Schlüsselwörter übereinstimmt, um beide einzuschließen.
177
+
178
+ Wenn Sie nur Tests einschließen möchten, die beide Muster enthalten, müssen Sie `und` verwenden:
179
+
180
+ ```bash
181
+ pytest -k "test and ada" tests/test_optimization.py
182
+ ```
183
+
184
+ ### Führen Sie `accelerate` Tests durch
185
+
186
+ Manchmal müssen Sie `accelerate` Tests für Ihre Modelle ausführen. Dazu fügen Sie einfach `-m accelerate_tests` zu Ihrem Befehl hinzu, wenn Sie diese Tests bei einem `OPT`-Lauf ausführen möchten:
187
+ ```bash
188
+ RUN_SLOW=1 pytest -m accelerate_tests tests/models/opt/test_modeling_opt.py
189
+ ```
190
+
191
+
192
+ ### Dokumentationstests ausführen
193
+
194
+ Um zu testen, ob die Dokumentationsbeispiele korrekt sind, sollten Sie überprüfen, ob die `doctests` erfolgreich sind.
195
+ Lassen Sie uns als Beispiel den docstring von [WhisperModel.forward](https://github.com/huggingface/transformers/blob/main/src/transformers/models/whisper/modeling_whisper.py#L1017-L1035) verwenden:
196
+
197
+ ```python
198
+ r"""
199
+ Returns:
200
+
201
+ Example:
202
+ ```python
203
+ >>> import torch
204
+ >>> from transformers import WhisperModel, WhisperFeatureExtractor
205
+ >>> from datasets import load_dataset
206
+
207
+ >>> model = WhisperModel.from_pretrained("openai/whisper-base")
208
+ >>> feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-base")
209
+ >>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
210
+ >>> inputs = feature_extractor(ds[0]["audio"]["array"], return_tensors="pt")
211
+ >>> input_features = inputs.input_features
212
+ >>> decoder_input_ids = torch.tensor([[1, 1]]) * model.config.decoder_start_token_id
213
+ >>> last_hidden_state = model(input_features, decoder_input_ids=decoder_input_ids).last_hidden_state
214
+ >>> list(last_hidden_state.shape)
215
+ [1, 2, 512]
216
+ ```"""
217
+
218
+ ```
219
+
220
+ Führen Sie einfach die folgende Zeile aus, um automatisch jedes docstring-Beispiel in der gewünschten Datei zu testen:
221
+ ```bash
222
+ pytest --doctest-modules <path_to_file_or_dir>
223
+ ```
224
+ Wenn die Datei eine Markdown-Erweiterung hat, sollten Sie das Argument `--doctest-glob="*.md"` hinzufügen.
225
+
226
+ ### Nur geänderte Tests ausführen
227
+
228
+ Mit [pytest-picked](https://github.com/anapaulagomes/pytest-picked) können Sie die Tests ausführen, die sich auf die unstaged Dateien oder den aktuellen Zweig (gemäß Git) beziehen. Auf diese Weise können Sie schnell testen, ob Ihre Änderungen nichts kaputt gemacht haben.
229
+ nichts kaputt gemacht haben, da die Tests für Dateien, die Sie nicht verändert haben, nicht ausgeführt werden.
230
+
231
+ ```bash
232
+ pip install pytest-picked
233
+ ```
234
+
235
+ ```bash
236
+ pytest --picked
237
+ ```
238
+
239
+ Alle Tests werden von Dateien und Ordnern ausgeführt, die geändert, aber noch nicht übergeben wurden.
240
+
241
+ ### Fehlgeschlagene Tests bei Änderung der Quelle automatisch wiederholen
242
+
243
+ [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) bietet eine sehr nützliche Funktion zur Erkennung aller fehlgeschlagenen
244
+ Tests zu erkennen und dann darauf zu warten, dass Sie Dateien ändern, um die fehlgeschlagenen Tests so lange zu wiederholen, bis sie erfolgreich sind, während Sie die
245
+ sie reparieren. So müssen Sie pytest nicht erneut starten, nachdem Sie die Korrektur vorgenommen haben. Dies wird so lange wiederholt, bis alle Tests bestanden sind.
246
+ Danach wird erneut ein vollständiger Durchlauf durchgeführt.
247
+
248
+ ```bash
249
+ pip install pytest-xdist
250
+ ```
251
+
252
+ So rufen Sie den Modus auf: `pytest -f` oder `pytest --looponfail`
253
+
254
+ Datei-Änderungen werden erkannt, indem die Wurzelverzeichnisse von `looponfailroots` und alle ihre Inhalte (rekursiv) untersucht werden.
255
+ Wenn die Vorgabe für diesen Wert für Sie nicht funktioniert, können Sie ihn in Ihrem Projekt ändern, indem Sie eine Konfigurations
256
+ Option in der Datei `setup.cfg` ändern:
257
+
258
+ ```ini
259
+ [tool:pytest]
260
+ looponfailroots = transformers tests
261
+ ```
262
+
263
+ oder die Dateien `pytest.ini`/`tox.ini``:
264
+
265
+ ```ini
266
+ [pytest]
267
+ looponfailroots = transformers tests
268
+ ```
269
+
270
+ Dies würde dazu führen, dass nur nach Dateiänderungen in den jeweiligen Verzeichnissen gesucht wird, die relativ zum Verzeichnis der ini-Datei angegeben sind.
271
+ Verzeichnis.
272
+
273
+ [pytest-watch](https://github.com/joeyespo/pytest-watch) ist eine alternative Implementierung dieser Funktionalität.
274
+
275
+
276
+ ### Überspringen eines Testmoduls
277
+
278
+ Wenn Sie alle Testmodule ausführen möchten, mit Ausnahme einiger weniger, können Sie diese ausschließen, indem Sie eine explizite Liste der auszuführenden Tests angeben. Für
279
+ Beispiel: Um alle Tests außer `test_modeling_*.py` auszuführen:
280
+
281
+ ```bash
282
+ pytest *ls -1 tests/*py | grep -v test_modeling*
283
+ ```
284
+
285
+ ### Status leeren
286
+
287
+ CI-Builds und wenn Isolation wichtig ist (gegen Geschwindigkeit), sollte der Cache geleert werden:
288
+
289
+ ```bash
290
+ pytest --cache-clear tests
291
+ ```
292
+
293
+ ### Tests parallel ausführen
294
+
295
+ Wie bereits erwähnt, führt `make test` über das Plugin `pytest-xdist` Tests parallel aus (Argument `-n X`, z.B. `-n 2`
296
+ um 2 Jobs parallel laufen zu lassen).
297
+
298
+ Mit der Option `--dist=` von `pytest-xdist` können Sie steuern, wie die Tests gruppiert werden. Mit `--dist=loadfile` werden die
299
+ Tests, die sich in einer Datei befinden, in denselben Prozess.
300
+
301
+ Da die Reihenfolge der ausgeführten Tests unterschiedlich und nicht vorhersehbar ist, kann die Ausführung der Testsuite mit `pytest-xdist`
302
+ zu Fehlern führt (was bedeutet, dass wir einige unentdeckte gekoppelte Tests haben), verwenden Sie [pytest-replay](https://github.com/ESSS/pytest-replay), um die Tests in der gleichen Reihenfolge abzuspielen, was dabei helfen sollte
303
+ diese fehlgeschlagene Sequenz auf ein Minimum zu reduzieren.
304
+
305
+ ### Testreihenfolge und Wiederholung
306
+
307
+ Es ist gut, die Tests mehrmals zu wiederholen, nacheinander, zufällig oder in Gruppen, um mögliche
308
+ Abhängigkeiten und zustandsbezogene Fehler zu erkennen (Abriss). Und die einfache, mehrfache Wiederholung ist einfach gut, um
309
+ einige Probleme zu erkennen, die durch die Zufälligkeit von DL aufgedeckt werden.
310
+
311
+
312
+ #### Wiederholungstests
313
+
314
+ - [pytest-flakefinder](https://github.com/dropbox/pytest-flakefinder):
315
+
316
+ ```bash
317
+ pip install pytest-flakefinder
318
+ ```
319
+
320
+ Und führen Sie dann jeden Test mehrmals durch (standardmäßig 50):
321
+
322
+ ```bash
323
+ pytest --flake-finder --flake-runs=5 tests/test_failing_test.py
324
+ ```
325
+
326
+ <Tip>
327
+
328
+ Dieses Plugin funktioniert nicht mit dem `-n` Flag von `pytest-xdist`.
329
+
330
+ </Tip>
331
+
332
+ <Tip>
333
+
334
+ Es gibt noch ein anderes Plugin `pytest-repeat`, aber es funktioniert nicht mit `unittest`.
335
+
336
+ </Tip>
337
+
338
+ #### Run tests in a random order
339
+
340
+ ```bash
341
+ pip install pytest-random-order
342
+ ```
343
+
344
+ Wichtig: Das Vorhandensein von `pytest-random-order` sorgt für eine automatische Zufallsanordnung der Tests, es sind keine Konfigurationsänderungen oder
345
+ Befehlszeilenoptionen sind nicht erforderlich.
346
+
347
+ Wie bereits erläutert, ermöglicht dies die Erkennung von gekoppelten Tests - bei denen der Zustand eines Tests den Zustand eines anderen beeinflusst. Wenn
348
+ `pytest-random-order` installiert ist, gibt es den Zufallswert aus, der für diese Sitzung verwendet wurde, z.B:
349
+
350
+ ```bash
351
+ pytest tests
352
+ [...]
353
+ Using --random-order-bucket=module
354
+ Using --random-order-seed=573663
355
+ ```
356
+
357
+ Wenn eine bestimmte Sequenz fehlschlägt, können Sie sie reproduzieren, indem Sie genau diesen Seed hinzufügen, z.B:
358
+
359
+ ```bash
360
+ pytest --random-order-seed=573663
361
+ [...]
362
+ Using --random-order-bucket=module
363
+ Using --random-order-seed=573663
364
+ ```
365
+
366
+ Es wird nur dann die exakte Reihenfolge reproduzieren, wenn Sie genau dieselbe Liste von Tests (oder gar keine Liste) verwenden. Sobald Sie beginnen, die Liste
367
+ die Liste manuell einzugrenzen, können Sie sich nicht mehr auf den Seed verlassen, sondern müssen die Tests manuell in der genauen Reihenfolge auflisten
368
+ auflisten und pytest anweisen, sie nicht zu randomisieren, indem Sie `--random-order-bucket=none` verwenden, z.B.:
369
+
370
+ ```bash
371
+ pytest --random-order-bucket=none tests/test_a.py tests/test_c.py tests/test_b.py
372
+ ```
373
+
374
+ So deaktivieren Sie das Shuffling für alle Tests:
375
+
376
+ ```bash
377
+ pytest --random-order-bucket=none
378
+ ```
379
+
380
+ Standardmäßig ist `--random-order-bucket=module` impliziert, wodurch die Dateien auf den Modulebenen gemischt werden. Es kann auch
381
+ auf den Ebenen `class`, `package`, `global` und `none` mischen. Die vollständigen Details entnehmen Sie bitte der
382
+ [Dokumentation](https://github.com/jbasko/pytest-random-order).
383
+
384
+ Eine weitere Alternative zur Randomisierung ist: [`pytest-random`](https://github.com/pytest-dev/pytest-randomly). Dieses
385
+ Modul hat eine sehr ähnliche Funktionalität/Schnittstelle, aber es hat nicht die Eimermodi, die in
386
+ `pytest-random-order` zur Verfügung. Es hat das gleiche Problem, dass es sich nach der Installation aufdrängt.
387
+
388
+ ### Variationen von Aussehen und Bedienung
389
+
390
+ #### pytest-zucker
391
+
392
+ [pytest-sugar](https://github.com/Frozenball/pytest-sugar) ist ein Plugin, das das Erscheinungsbild verbessert, eine
393
+ Fortschrittsbalken hinzufügt und Tests, die fehlschlagen, sowie die Bestätigung sofort anzeigt. Es wird bei der Installation automatisch aktiviert.
394
+
395
+ ```bash
396
+ pip install pytest-sugar
397
+ ```
398
+
399
+ Um Tests ohne sie durchzuführen, führen Sie aus:
400
+
401
+ ```bash
402
+ pytest -p no:sugar
403
+ ```
404
+
405
+ oder deinstallieren Sie es.
406
+
407
+
408
+
409
+ #### Melden Sie den Namen jedes Subtests und seinen Fortschritt
410
+
411
+ Für einen einzelnen oder eine Gruppe von Tests über `pytest` (nach `pip install pytest-pspec`):
412
+
413
+ ```bash
414
+ pytest --pspec tests/test_optimization.py
415
+ ```
416
+
417
+ #### Zeigt fehlgeschlagene Tests sofort an
418
+
419
+ [pytest-instafail](https://github.com/pytest-dev/pytest-instafail) zeigt Fehlschläge und Fehler sofort an, anstatt
420
+ bis zum Ende der Testsitzung zu warten.
421
+
422
+ ```bash
423
+ pip install pytest-instafail
424
+ ```
425
+
426
+ ```bash
427
+ pytest --instafail
428
+ ```
429
+
430
+ ### Zu GPU oder nicht zu GPU
431
+
432
+ Bei einem GPU-aktivierten Setup fügen Sie zum Testen im reinen CPU-Modus `CUDA_VISIBLE_DEVICES=""` hinzu:
433
+
434
+ ```bash
435
+ CUDA_VISIBLE_DEVICES="" pytest tests/utils/test_logging.py
436
+ ```
437
+
438
+ oder wenn Sie mehrere Grafikprozessoren haben, können Sie angeben, welcher von `pytest` verwendet werden soll. Wenn Sie zum Beispiel nur den
439
+ zweiten Grafikkarte zu verwenden, wenn Sie die Grafikkarten `0` und `1` haben, können Sie folgendes ausführen:
440
+
441
+ ```bash
442
+ CUDA_VISIBLE_DEVICES="1" pytest tests/utils/test_logging.py
443
+ ```
444
+
445
+ Dies ist praktisch, wenn Sie verschiedene Aufgaben auf verschiedenen GPUs ausführen möchten.
446
+
447
+ Einige Tests müssen nur auf der CPU ausgeführt werden, andere entweder auf der CPU, der GPU oder der TPU und wieder andere auf mehreren GPUs. Die folgenden skip
448
+ Dekorateure werden verwendet, um die Anforderungen von Tests in Bezug auf CPU/GPU/TPU festzulegen:
449
+
450
+ - `require_torch` - dieser Test wird nur unter Torch ausgeführt
451
+ - `require_torch_gpu` - wie `require_torch` plus erfordert mindestens 1 GPU
452
+ - `require_torch_multi_gpu` - wie `require_torch` und zusätzlich mindestens 2 GPUs erforderlich
453
+ - `require_torch_non_multi_gpu` - wie `require_torch` plus benötigt 0 oder 1 GPUs
454
+ - `require_torch_up_to_2_gpus` - wie `require_torch` plus erfordert 0 oder 1 oder 2 GPUs
455
+ - `require_torch_xla` - wie `require_torch` plus erfordert mindestens 1 TPU
456
+
457
+ Lassen Sie uns die GPU-Anforderungen in der folgenden Tabelle darstellen:
458
+
459
+
460
+ | n gpus | decorator |
461
+ |--------|--------------------------------|
462
+ | `>= 0` | `@require_torch` |
463
+ | `>= 1` | `@require_torch_gpu` |
464
+ | `>= 2` | `@require_torch_multi_gpu` |
465
+ | `< 2` | `@require_torch_non_multi_gpu` |
466
+ | `< 3` | `@require_torch_up_to_2_gpus` |
467
+
468
+
469
+ Hier ist zum Beispiel ein Test, der nur ausgeführt werden muss, wenn 2 oder mehr GPUs verfügbar sind und pytorch installiert ist:
470
+
471
+ ```python no-style
472
+ @require_torch_multi_gpu
473
+ def test_example_with_multi_gpu():
474
+ ```
475
+
476
+ Wenn ein Test `tensorflow` benötigt, verwenden Sie den Dekorator `require_tf`. Zum Beispiel:
477
+
478
+ ```python no-style
479
+ @require_tf
480
+ def test_tf_thing_with_tensorflow():
481
+ ```
482
+
483
+ Diese Dekors können gestapelt werden. Wenn zum Beispiel ein Test langsam ist und mindestens eine GPU unter pytorch benötigt, können Sie
484
+ wie Sie ihn einrichten können:
485
+
486
+ ```python no-style
487
+ @require_torch_gpu
488
+ @slow
489
+ def test_example_slow_on_gpu():
490
+ ```
491
+
492
+ Einige Dekoratoren wie `@parametrized` schreiben Testnamen um, daher müssen `@require_*`-Sprungdekoratoren als letztes aufgeführt werden.
493
+ zuletzt aufgeführt werden, damit sie korrekt funktionieren. Hier ist ein Beispiel für die korrekte Verwendung:
494
+
495
+ ```python no-style
496
+ @parameterized.expand(...)
497
+ @require_torch_multi_gpu
498
+ def test_integration_foo():
499
+ ```
500
+
501
+ Dieses Problem mit der Reihenfolge gibt es bei `@pytest.mark.parametrize` nicht, Sie können es an den Anfang oder an den Schluss setzen und es wird trotzdem funktionieren.
502
+ funktionieren. Aber es funktioniert nur bei Nicht-Unittests.
503
+
504
+ Innerhalb von Tests:
505
+
506
+ - Wie viele GPUs sind verfügbar:
507
+
508
+ ```python
509
+ from transformers.testing_utils import get_gpu_count
510
+
511
+ n_gpu = get_gpu_count() # works with torch and tf
512
+ ```
513
+
514
+ ### Testen mit einem bestimmten PyTorch-Backend oder Gerät
515
+
516
+ Um die Testsuite auf einem bestimmten Torch-Gerät auszuführen, fügen Sie `TRANSFORMERS_TEST_DEVICE="$Gerät"` hinzu, wobei `$Gerät` das Ziel-Backend ist. Zum Beispiel, um nur auf der CPU zu testen:
517
+ ```bash
518
+ TRANSFORMERS_TEST_DEVICE="cpu" pytest tests/utils/test_logging.py
519
+ ```
520
+
521
+ Diese Variable ist nützlich, um benutzerdefinierte oder weniger verbreitete PyTorch-Backends wie `mps` zu testen. Sie kann auch verwendet werden, um den gleichen Effekt wie `CUDA_VISIBLE_DEVICES` zu erzielen, indem Sie bestimmte GPUs anvisieren oder im reinen CPU-Modus testen.
522
+
523
+ Bestimmte Geräte erfordern einen zusätzlichen Import, nachdem Sie `torch` zum ersten Mal importiert haben. Dies kann über die Umgebungsvariable `TRANSFORMERS_TEST_BACKEND` festgelegt werden:
524
+ ```bash
525
+ TRANSFORMERS_TEST_BACKEND="torch_npu" pytest tests/utils/test_logging.py
526
+ ```
527
+
528
+
529
+ ### Verteiltes Training
530
+
531
+ `pytest` kann nicht direkt mit verteiltem Training umgehen. Wenn dies versucht wird, tun die Unterprozesse nicht das Richtige
532
+ und denken am Ende, sie seien `pytest` und beginnen, die Testsuite in Schleifen auszuführen. Es funktioniert jedoch, wenn man
533
+ einen normalen Prozess erzeugt, der dann mehrere Worker erzeugt und die IO-Pipes verwaltet.
534
+
535
+ Hier sind einige Tests, die dies verwenden:
536
+
537
+ - [test_trainer_distributed.py](https://github.com/huggingface/transformers/tree/main/tests/trainer/test_trainer_distributed.py)
538
+ - [test_deepspeed.py](https://github.com/huggingface/transformers/tree/main/tests/deepspeed/test_deepspeed.py)
539
+
540
+ Um direkt mit der Ausführung zu beginnen, suchen Sie in diesen Tests nach dem Aufruf `execute_subprocess_async`.
541
+
542
+ Sie benötigen mindestens 2 GPUs, um diese Tests in Aktion zu sehen:
543
+
544
+ ```bash
545
+ CUDA_VISIBLE_DEVICES=0,1 RUN_SLOW=1 pytest -sv tests/test_trainer_distributed.py
546
+ ```
547
+
548
+ ### Erfassung von Ausgaben
549
+
550
+ Während der Testausführung werden alle Ausgaben, die an `stdout` und `stderr` gesendet werden, aufgezeichnet. Wenn ein Test oder eine Setup-Methode fehlschlägt, wird die
551
+ wird die entsprechende aufgezeichnete Ausgabe in der Regel zusammen mit dem Fehler-Traceback angezeigt.
552
+
553
+ Um die Aufzeichnung von Ausgaben zu deaktivieren und `stdout` und `stderr` normal zu erhalten, verwenden Sie `-s` oder `--capture=no`:
554
+
555
+ ```bash
556
+ pytest -s tests/utils/test_logging.py
557
+ ```
558
+
559
+ So senden Sie Testergebnisse an die JUnit-Formatausgabe:
560
+
561
+ ```bash
562
+ py.test tests --junitxml=result.xml
563
+ ```
564
+
565
+ ### Farbsteuerung
566
+
567
+ Keine Farbe zu haben (z.B. gelb auf weißem Hintergrund ist nicht lesbar):
568
+
569
+ ```bash
570
+ pytest --color=no tests/utils/test_logging.py
571
+ ```
572
+
573
+ ### Testbericht an den Online-Dienst pastebin senden
574
+
575
+ Erstellen Sie eine URL für jeden Testfehler:
576
+
577
+ ```bash
578
+ pytest --pastebin=failed tests/utils/test_logging.py
579
+ ```
580
+
581
+ Dadurch werden Informationen über den Testlauf an einen entfernten Paste-Dienst übermittelt und eine URL für jeden Fehlschlag bereitgestellt. Sie können die
582
+ Tests wie gewohnt auswählen oder z.B. -x hinzufügen, wenn Sie nur einen bestimmten Fehler senden möchten.
583
+
584
+ Erstellen einer URL für ein ganzes Testsitzungsprotokoll:
585
+
586
+ ```bash
587
+ pytest --pastebin=all tests/utils/test_logging.py
588
+ ```
589
+
590
+ ## Tests schreiben
591
+
592
+ 🤗 Die Tests von Transformers basieren auf `unittest`, werden aber von `pytest` ausgeführt, so dass die meiste Zeit Funktionen aus beiden Systemen
593
+ verwendet werden können.
594
+
595
+ Sie können [hier](https://docs.pytest.org/en/stable/unittest.html) nachlesen, welche Funktionen unterstützt werden, aber das Wichtigste ist
596
+ Wichtig ist, dass die meisten `pytest`-Fixtures nicht funktionieren. Auch die Parametrisierung nicht, aber wir verwenden das Modul
597
+ `parametrisiert`, das auf ähnliche Weise funktioniert.
598
+
599
+
600
+ ### Parametrisierung
601
+
602
+ Oft besteht die Notwendigkeit, denselben Test mehrmals auszuführen, aber mit unterschiedlichen Argumenten. Das könnte innerhalb des Tests geschehen
603
+ des Tests gemacht werden, aber dann gibt es keine Möglichkeit, den Test mit nur einem Satz von Argumenten auszuführen.
604
+
605
+ ```python
606
+ # test_this1.py
607
+ import unittest
608
+ from parameterized import parameterized
609
+
610
+
611
+ class TestMathUnitTest(unittest.TestCase):
612
+ @parameterized.expand(
613
+ [
614
+ ("negative", -1.5, -2.0),
615
+ ("integer", 1, 1.0),
616
+ ("large fraction", 1.6, 1),
617
+ ]
618
+ )
619
+ def test_floor(self, name, input, expected):
620
+ assert_equal(math.floor(input), expected)
621
+ ```
622
+
623
+ Nun wird dieser Test standardmäßig 3 Mal ausgeführt, wobei jedes Mal die letzten 3 Argumente von `test_floor` den entsprechenden Argumenten in der Parameterliste zugeordnet werden.
624
+ die entsprechenden Argumente in der Parameterliste.
625
+
626
+ Sie können auch nur die Parameter `negativ` und `ganzzahlig` mit ausführen:
627
+
628
+ ```bash
629
+ pytest -k "negative and integer" tests/test_mytest.py
630
+ ```
631
+
632
+ oder alle Untertests außer `negativ`, mit:
633
+
634
+ ```bash
635
+ pytest -k "not negative" tests/test_mytest.py
636
+ ```
637
+
638
+ Neben der Verwendung des gerade erwähnten Filters `-k` können Sie auch den genauen Namen jedes Untertests herausfinden und jeden
639
+ oder alle unter Verwendung ihrer genauen Namen ausführen.
640
+
641
+ ```bash
642
+ pytest test_this1.py --collect-only -q
643
+ ```
644
+
645
+ und es wird aufgelistet:
646
+
647
+ ```bash
648
+ test_this1.py::TestMathUnitTest::test_floor_0_negative
649
+ test_this1.py::TestMathUnitTest::test_floor_1_integer
650
+ test_this1.py::TestMathUnitTest::test_floor_2_large_fraction
651
+ ```
652
+
653
+ Jetzt können Sie also nur 2 spezifische Untertests durchführen:
654
+
655
+ ```bash
656
+ pytest test_this1.py::TestMathUnitTest::test_floor_0_negative test_this1.py::TestMathUnitTest::test_floor_1_integer
657
+ ```
658
+
659
+ Das Modul [parametrisiert](https://pypi.org/project/parameterized/), das sich bereits in den Entwickler-Abhängigkeiten befindet
660
+ von `transformers` befindet, funktioniert sowohl für `unittests` als auch für `pytest` Tests.
661
+
662
+ Wenn es sich bei dem Test jedoch nicht um einen `Unittest` handelt, können Sie `pytest.mark.parametrize` verwenden (oder Sie können sehen, dass es in
663
+ einigen bestehenden Tests verwendet wird, meist unter `Beispiele`).
664
+
665
+ Hier ist das gleiche Beispiel, diesmal unter Verwendung der `parametrize`-Markierung von `pytest`:
666
+
667
+ ```python
668
+ # test_this2.py
669
+ import pytest
670
+
671
+
672
+ @pytest.mark.parametrize(
673
+ "name, input, expected",
674
+ [
675
+ ("negative", -1.5, -2.0),
676
+ ("integer", 1, 1.0),
677
+ ("large fraction", 1.6, 1),
678
+ ],
679
+ )
680
+ def test_floor(name, input, expected):
681
+ assert_equal(math.floor(input), expected)
682
+ ```
683
+
684
+ Genau wie bei `parametrisiert` können Sie mit `pytest.mark.parametrize` genau steuern, welche Subtests ausgeführt werden
685
+ ausgeführt werden, wenn der Filter `-k` nicht ausreicht. Allerdings erzeugt diese Parametrisierungsfunktion einen etwas anderen Satz von
686
+ Namen für die Untertests. Sie sehen folgendermaßen aus:
687
+
688
+ ```bash
689
+ pytest test_this2.py --collect-only -q
690
+ ```
691
+
692
+ und es wird aufgelistet:
693
+
694
+ ```bash
695
+ test_this2.py::test_floor[integer-1-1.0]
696
+ test_this2.py::test_floor[negative--1.5--2.0]
697
+ test_this2.py::test_floor[large fraction-1.6-1]
698
+ ```
699
+
700
+ Jetzt können Sie also nur den spezifischen Test durchführen:
701
+
702
+ ```bash
703
+ pytest test_this2.py::test_floor[negative--1.5--2.0] test_this2.py::test_floor[integer-1-1.0]
704
+ ```
705
+
706
+ wie im vorherigen Beispiel.
707
+
708
+
709
+
710
+ ### Dateien und Verzeichnisse
711
+
712
+ In Tests müssen wir oft wissen, wo sich Dinge relativ zur aktuellen Testdatei befinden, und das ist nicht trivial, da der Test
713
+ von mehreren Verzeichnissen aus aufgerufen werden kann oder sich in Unterverzeichnissen mit unterschiedlicher Tiefe befinden kann. Eine Hilfsklasse
714
+ `transformers.test_utils.TestCasePlus` löst dieses Problem, indem sie alle grundlegenden Pfade sortiert und einfache
715
+ Zugriffsmöglichkeiten auf sie bietet:
716
+
717
+ - `pathlib`-Objekte (alle vollständig aufgelöst):
718
+
719
+ - `test_file_path` - der aktuelle Testdateipfad, d.h. `__file__`
720
+ - `test_file_dir` - das Verzeichnis, das die aktuelle Testdatei enthält
721
+ - `tests_dir` - das Verzeichnis der `tests` Testreihe
722
+ - `examples_dir` - das Verzeichnis der `examples` Test-Suite
723
+ - `repo_root_dir` - das Verzeichnis des Repositorys
724
+ - `src_dir` - das Verzeichnis von `src` (d.h. wo sich das Unterverzeichnis `transformers` befindet)
725
+
726
+ - stringifizierte Pfade - wie oben, aber diese geben Pfade als Strings zurück, anstatt als `pathlib`-Objekte:
727
+
728
+ - `test_file_path_str`
729
+ - `test_file_dir_str`
730
+ - `tests_dir_str`
731
+ - `examples_dir_str`
732
+ - `repo_root_dir_str`
733
+ - `src_dir_str`
734
+
735
+ Um diese zu verwenden, müssen Sie lediglich sicherstellen, dass der Test in einer Unterklasse von
736
+ `transformers.test_utils.TestCasePlus` befindet. Zum Beispiel:
737
+
738
+ ```python
739
+ from transformers.testing_utils import TestCasePlus
740
+
741
+
742
+ class PathExampleTest(TestCasePlus):
743
+ def test_something_involving_local_locations(self):
744
+ data_dir = self.tests_dir / "fixtures/tests_samples/wmt_en_ro"
745
+ ```
746
+
747
+ Wenn Sie Pfade nicht über `pathlib` manipulieren müssen oder nur einen Pfad als String benötigen, können Sie jederzeit
748
+ `str()` auf das `pathlib`-Objekt anwenden oder die Accessoren mit der Endung `_str` verwenden. Zum Beispiel:
749
+
750
+ ```python
751
+ from transformers.testing_utils import TestCasePlus
752
+
753
+
754
+ class PathExampleTest(TestCasePlus):
755
+ def test_something_involving_stringified_locations(self):
756
+ examples_dir = self.examples_dir_str
757
+ ```
758
+
759
+ ### Temporäre Dateien und Verzeichnisse
760
+
761
+ Die Verwendung eindeutiger temporärer Dateien und Verzeichnisse ist für die parallele Durchführung von Tests unerlässlich, damit sich die Tests nicht gegenseitig überschreiben.
762
+ Daten gegenseitig überschreiben. Außerdem möchten wir, dass die temporären Dateien und Verzeichnisse am Ende jedes Tests, der sie erstellt hat, gelöscht werden.
763
+ erstellt hat. Daher ist die Verwendung von Paketen wie `tempfile`, die diese Anforderungen erfüllen, unerlässlich.
764
+
765
+ Beim Debuggen von Tests müssen Sie jedoch sehen können, was in der temporären Datei oder dem temporären Verzeichnis gespeichert wird und Sie möchten
766
+ Sie müssen den genauen Pfad kennen und dürfen ihn nicht bei jedem neuen Testdurchlauf zufällig ändern.
767
+
768
+ Für solche Zwecke ist die Hilfsklasse `transformers.test_utils.TestCasePlus` am besten geeignet. Sie ist eine Unterklasse von
769
+ Unittest.TestCase`, so dass wir in den Testmodulen einfach von ihr erben können.
770
+
771
+ Hier ist ein Beispiel für die Verwendung dieser Klasse:
772
+
773
+ ```python
774
+ from transformers.testing_utils import TestCasePlus
775
+
776
+
777
+ class ExamplesTests(TestCasePlus):
778
+ def test_whatever(self):
779
+ tmp_dir = self.get_auto_remove_tmp_dir()
780
+ ```
781
+
782
+ Dieser Code erstellt ein eindeutiges temporäres Verzeichnis und setzt `tmp_dir` auf dessen Speicherort.
783
+
784
+ - Erstellen Sie ein eindeutiges temporäres Verzeichnis:
785
+
786
+ ```python
787
+ def test_whatever(self):
788
+ tmp_dir = self.get_auto_remove_tmp_dir()
789
+ ```
790
+
791
+ tmp_dir" enthält den Pfad zu dem erstellten temporären Verzeichnis. Es wird am Ende des Tests automatisch entfernt.
792
+ Tests entfernt.
793
+
794
+ - Erstellen Sie ein temporäres Verzeichnis meiner Wahl, stellen Sie sicher, dass es leer ist, bevor der Test beginnt, und leeren Sie es nach dem Test nicht.
795
+
796
+ ```python
797
+ def test_whatever(self):
798
+ tmp_dir = self.get_auto_remove_tmp_dir("./xxx")
799
+ ```
800
+
801
+ Dies ist nützlich für die Fehlersuche, wenn Sie ein bestimmtes Verzeichnis überwachen und sicherstellen möchten, dass die vorherigen Tests keine Daten darin hinterlassen haben.
802
+ keine Daten dort hinterlassen haben.
803
+
804
+ - Sie können das Standardverhalten außer Kraft setzen, indem Sie die Argumente `before` und `after` direkt überschreiben, was zu einem der folgenden Verhaltensweisen führt
805
+ folgenden Verhaltensweisen:
806
+
807
+ - `before=True`: das temporäre Verzeichnis wird immer zu Beginn des Tests gelöscht.
808
+ - `before=False`: wenn das temporäre Verzeichnis bereits existiert, bleiben alle vorhandenen Dateien dort erhalten.
809
+ - `after=True`: das temporäre Verzeichnis wird immer am Ende des Tests gelöscht.
810
+ - `after=False`: das temporäre Verzeichnis wird am Ende des Tests immer beibehalten.
811
+
812
+ <Tip>
813
+
814
+ Um das Äquivalent von `rm -r` sicher ausführen zu können, sind nur Unterverzeichnisse des Projektarchivs checkout erlaubt, wenn
815
+ ein explizites `tmp_dir` verwendet wird, so dass nicht versehentlich ein `/tmp` oder ein ähnlich wichtiger Teil des Dateisystems vernichtet wird.
816
+ d.h. geben Sie bitte immer Pfade an, die mit `./` beginnen.
817
+
818
+ </Tip>
819
+
820
+ <Tip>
821
+
822
+ Jeder Test kann mehrere temporäre Verzeichnisse registrieren, die alle automatisch entfernt werden, sofern nicht anders gewünscht.
823
+ anders.
824
+
825
+ </Tip>
826
+
827
+ ### Temporäre Überschreibung von sys.path
828
+
829
+ Wenn Sie `sys.path` vorübergehend überschreiben müssen, um z.B. von einem anderen Test zu importieren, können Sie den
830
+ Kontextmanager `ExtendSysPath` verwenden. Beispiel:
831
+
832
+
833
+ ```python
834
+ import os
835
+ from transformers.testing_utils import ExtendSysPath
836
+
837
+ bindir = os.path.abspath(os.path.dirname(__file__))
838
+ with ExtendSysPath(f"{bindir}/.."):
839
+ from test_trainer import TrainerIntegrationCommon # noqa
840
+ ```
841
+
842
+ ### Überspringen von Tests
843
+
844
+ Dies ist nützlich, wenn ein Fehler gefunden und ein neuer Test geschrieben wird, der Fehler aber noch nicht behoben ist. Damit wir ihn
845
+ in das Haupt-Repository zu übertragen, müssen wir sicherstellen, dass er bei `make test` übersprungen wird.
846
+
847
+ Methoden:
848
+
849
+ - Ein **Skip** bedeutet, dass Sie erwarten, dass Ihr Test nur dann erfolgreich ist, wenn einige Bedingungen erfüllt sind, andernfalls sollte pytest den Test überspringen.
850
+ die Ausführung des Tests ganz überspringen. Übliche Beispiele sind das Überspringen von Tests, die nur unter Windows laufen, auf Nicht-Windows-Plattformen oder das Überspringen von
851
+ Tests, die von einer externen Ressource abhängen, die im Moment nicht verfügbar ist (z.B. eine Datenbank).
852
+
853
+ - Ein **xfail** bedeutet, dass Sie erwarten, dass ein Test aus irgendeinem Grund fehlschlägt. Ein gängiges Beispiel ist ein Test für eine Funktion, die noch nicht
854
+ noch nicht implementiert oder ein noch nicht behobener Fehler. Wenn ein Test trotz eines erwarteten Fehlschlags bestanden wird (markiert mit
855
+ pytest.mark.xfail), ist dies ein xpass und wird in der Testzusammenfassung gemeldet.
856
+
857
+ Einer der wichtigsten Unterschiede zwischen den beiden ist, dass `skip` den Test nicht ausführt, während `xfail` dies tut. Wenn also der
858
+ Code, der fehlerhaft ist, einen schlechten Zustand verursacht, der sich auf andere Tests auswirkt, sollten Sie also nicht `xfail` verwenden.
859
+
860
+ #### Implementierung
861
+
862
+ - Hier sehen Sie, wie Sie einen ganzen Test bedingungslos überspringen können:
863
+
864
+ ```python no-style
865
+ @unittest.skip("this bug needs to be fixed")
866
+ def test_feature_x():
867
+ ```
868
+
869
+ oder mit pytest:
870
+
871
+ ```python no-style
872
+ @pytest.mark.skip(reason="this bug needs to be fixed")
873
+ ```
874
+
875
+ oder mit dem `xfail` Weg:
876
+
877
+ ```python no-style
878
+ @pytest.mark.xfail
879
+ def test_feature_x():
880
+ ```
881
+
882
+ - Hier erfahren Sie, wie Sie einen Test aufgrund einer internen Prüfung innerhalb des Tests auslassen können:
883
+
884
+ ```python
885
+ def test_feature_x():
886
+ if not has_something():
887
+ pytest.skip("unsupported configuration")
888
+ ```
889
+
890
+ oder das ganze Modul:
891
+
892
+ ```python
893
+ import pytest
894
+
895
+ if not pytest.config.getoption("--custom-flag"):
896
+ pytest.skip("--custom-flag is missing, skipping tests", allow_module_level=True)
897
+ ```
898
+
899
+ oder mit dem `xfail` Weg:
900
+
901
+ ```python
902
+ def test_feature_x():
903
+ pytest.xfail("expected to fail until bug XYZ is fixed")
904
+ ```
905
+
906
+ - Hier erfahren Sie, wie Sie alle Tests in einem Modul überspringen können, wenn ein Import fehlt:
907
+
908
+ ```python
909
+ docutils = pytest.importorskip("docutils", minversion="0.3")
910
+ ```
911
+
912
+ - Einen Test aufgrund einer Bedingung überspringen:
913
+
914
+ ```python no-style
915
+ @pytest.mark.skipif(sys.version_info < (3,6), reason="requires python3.6 or higher")
916
+ def test_feature_x():
917
+ ```
918
+
919
+ oder:
920
+
921
+ ```python no-style
922
+ @unittest.skipIf(torch_device == "cpu", "Can't do half precision")
923
+ def test_feature_x():
924
+ ```
925
+
926
+ oder überspringen Sie das ganze Modul:
927
+
928
+ ```python no-style
929
+ @pytest.mark.skipif(sys.platform == 'win32', reason="does not run on windows")
930
+ class TestClass():
931
+ def test_feature_x(self):
932
+ ```
933
+
934
+ Weitere Details, Beispiele und Möglichkeiten finden Sie [hier](https://docs.pytest.org/en/latest/skipping.html).
935
+
936
+ ### Langsame Tests
937
+
938
+ Die Bibliothek der Tests wächst ständig, und einige der Tests brauchen Minuten, um ausgeführt zu werden, daher können wir es uns nicht leisten, eine Stunde zu warten, bis die
939
+ eine Stunde auf die Fertigstellung der Testsuite auf CI zu warten. Daher sollten langsame Tests, mit einigen Ausnahmen für wichtige Tests, wie im folgenden Beispiel
940
+ wie im folgenden Beispiel markiert werden:
941
+
942
+ ```python no-style
943
+ from transformers.testing_utils import slow
944
+ @slow
945
+ def test_integration_foo():
946
+ ```
947
+
948
+ Sobald ein Test als `@slow` markiert ist, setzen Sie die Umgebungsvariable `RUN_SLOW=1`, um solche Tests auszuführen, z.B:
949
+
950
+ ```bash
951
+ RUN_SLOW=1 pytest tests
952
+ ```
953
+
954
+ Einige Dekoratoren wie `@parameterized` schreiben Testnamen um, daher müssen `@slow` und die übrigen Skip-Dekoratoren
955
+ `@require_*` müssen als letztes aufgeführt werden, damit sie korrekt funktionieren. Hier ist ein Beispiel für die korrekte Verwendung:
956
+
957
+ ```python no-style
958
+ @parameterized.expand(...)
959
+ @slow
960
+ def test_integration_foo():
961
+ ```
962
+
963
+ Wie zu Beginn dieses Dokuments erläutert, werden langsame Tests nach einem Zeitplan ausgeführt und nicht in PRs CI
964
+ Prüfungen. Es ist also möglich, dass einige Probleme bei der Einreichung eines PRs übersehen werden und zusammengeführt werden. Solche Probleme werden
965
+ werden beim nächsten geplanten CI-Job abgefangen. Das bedeutet aber auch, dass es wichtig ist, die langsamen Tests auf Ihrem
966
+ Rechner auszuführen, bevor Sie den PR einreichen.
967
+
968
+ Hier ist ein grober Entscheidungsmechanismus für die Auswahl der Tests, die als langsam markiert werden sollen:
969
+
970
+ Wenn der Test auf eine der internen Komponenten der Bibliothek ausgerichtet ist (z.B. Modellierungsdateien, Tokenisierungsdateien,
971
+ Pipelines), dann sollten wir diesen Test in der nicht langsamen Testsuite ausführen. Wenn er sich auf einen anderen Aspekt der Bibliothek bezieht,
972
+ wie z.B. die Dokumentation oder die Beispiele, dann sollten wir diese Tests in der langsamen Testsuite durchführen. Und dann, zur Verfeinerung
973
+ Ansatz zu verfeinern, sollten wir Ausnahmen einführen:
974
+
975
+ - Alle Tests, die einen umfangreichen Satz von Gewichten oder einen Datensatz mit einer Größe von mehr als ~50MB herunterladen müssen (z.B. Modell- oder
976
+ Tokenizer-Integrationstests, Pipeline-Integrationstests) sollten auf langsam gesetzt werden. Wenn Sie ein neues Modell hinzufügen, sollten Sie
977
+ sollten Sie eine kleine Version des Modells (mit zufälligen Gewichtungen) für Integrationstests erstellen und in den Hub hochladen. Dies wird
978
+ wird in den folgenden Abschnitten erläutert.
979
+ - Alle Tests, die ein Training durchführen müssen, das nicht speziell auf Schnelligkeit optimiert ist, sollten auf langsam gesetzt werden.
980
+ - Wir können Ausnahmen einführen, wenn einige dieser Tests, die nicht langsam sein sollten, unerträglich langsam sind, und sie auf
981
+ `@slow`. Auto-Modellierungstests, die große Dateien auf der Festplatte speichern und laden, sind ein gutes Beispiel für Tests, die als
982
+ als `@slow` markiert sind.
983
+ - Wenn ein Test in weniger als 1 Sekunde auf CI abgeschlossen wird (einschließlich eventueller Downloads), sollte es sich trotzdem um einen normalen Test handeln.
984
+
985
+ Insgesamt müssen alle nicht langsamen Tests die verschiedenen Interna abdecken und dabei schnell bleiben. Zum Beispiel,
986
+ kann eine signifikante Abdeckung erreicht werden, indem Sie mit speziell erstellten kleinen Modellen mit zufälligen Gewichten testen. Solche Modelle
987
+ haben eine sehr geringe Anzahl von Schichten (z.B. 2), Vokabeln (z.B. 1000), usw. Dann können die `@slow`-Tests große
988
+ langsame Modelle verwenden, um qualitative Tests durchzuführen. Um die Verwendung dieser Modelle zu sehen, suchen Sie einfach nach *winzigen* Modellen mit:
989
+
990
+ ```bash
991
+ grep tiny tests examples
992
+ ```
993
+
994
+ Hier ist ein Beispiel für ein [Skript](https://github.com/huggingface/transformers/tree/main/scripts/fsmt/fsmt-make-tiny-model.py), das das winzige Modell erstellt hat
995
+ [stas/tiny-wmt19-en-de](https://huggingface.co/stas/tiny-wmt19-en-de). Sie können es ganz einfach an Ihre eigene
996
+ Architektur Ihres Modells anpassen.
997
+
998
+ Es ist leicht, die Laufzeit falsch zu messen, wenn zum Beispiel ein großes Modell heruntergeladen wird, aber wenn
999
+ Sie es lokal testen, würden die heruntergeladenen Dateien zwischengespeichert und somit die Download-Zeit nicht gemessen werden. Prüfen Sie daher den
1000
+ Ausführungsgeschwindigkeitsbericht in den CI-Protokollen (die Ausgabe von `pytest --durations=0 tests`).
1001
+
1002
+ Dieser Bericht ist auch nützlich, um langsame Ausreißer zu finden, die nicht als solche gekennzeichnet sind oder die neu geschrieben werden müssen, um schnell zu sein.
1003
+ Wenn Sie bemerken, dass die Testsuite beim CI langsam wird, zeigt die oberste Liste dieses Berichts die langsamsten
1004
+ Tests.
1005
+
1006
+
1007
+ ### Testen der stdout/stderr-Ausgabe
1008
+
1009
+ Um Funktionen zu testen, die in `stdout` und/oder `stderr` schreiben, kann der Test auf diese Ströme zugreifen, indem er die
1010
+ [capsys system](https://docs.pytest.org/en/latest/capture.html) von `pytest` zugreifen. So wird dies bewerkstelligt:
1011
+
1012
+ ```python
1013
+ import sys
1014
+
1015
+
1016
+ def print_to_stdout(s):
1017
+ print(s)
1018
+
1019
+
1020
+ def print_to_stderr(s):
1021
+ sys.stderr.write(s)
1022
+
1023
+
1024
+ def test_result_and_stdout(capsys):
1025
+ msg = "Hello"
1026
+ print_to_stdout(msg)
1027
+ print_to_stderr(msg)
1028
+ out, err = capsys.readouterr() # consume the captured output streams
1029
+ # optional: if you want to replay the consumed streams:
1030
+ sys.stdout.write(out)
1031
+ sys.stderr.write(err)
1032
+ # test:
1033
+ assert msg in out
1034
+ assert msg in err
1035
+ ```
1036
+
1037
+ Und natürlich wird `stderr` in den meisten Fällen als Teil einer Ausnahme auftreten, so dass try/except in einem solchen Fall verwendet werden muss
1038
+ Fall verwendet werden:
1039
+
1040
+ ```python
1041
+ def raise_exception(msg):
1042
+ raise ValueError(msg)
1043
+
1044
+
1045
+ def test_something_exception():
1046
+ msg = "Not a good value"
1047
+ error = ""
1048
+ try:
1049
+ raise_exception(msg)
1050
+ except Exception as e:
1051
+ error = str(e)
1052
+ assert msg in error, f"{msg} is in the exception:\n{error}"
1053
+ ```
1054
+
1055
+ Ein anderer Ansatz zur Erfassung von stdout ist `contextlib.redirect_stdout`:
1056
+
1057
+ ```python
1058
+ from io import StringIO
1059
+ from contextlib import redirect_stdout
1060
+
1061
+
1062
+ def print_to_stdout(s):
1063
+ print(s)
1064
+
1065
+
1066
+ def test_result_and_stdout():
1067
+ msg = "Hello"
1068
+ buffer = StringIO()
1069
+ with redirect_stdout(buffer):
1070
+ print_to_stdout(msg)
1071
+ out = buffer.getvalue()
1072
+ # optional: if you want to replay the consumed streams:
1073
+ sys.stdout.write(out)
1074
+ # test:
1075
+ assert msg in out
1076
+ ```
1077
+
1078
+ Ein wichtiges potenzielles Problem beim Erfassen von stdout ist, dass es `r` Zeichen enthalten kann, die bei normalem `print`
1079
+ alles zurücksetzen, was bisher gedruckt wurde. Mit `pytest` gibt es kein Problem, aber mit `pytest -s` werden diese
1080
+ werden diese Zeichen in den Puffer aufgenommen. Um den Test mit und ohne `-s` laufen zu lassen, müssen Sie also eine zusätzliche Bereinigung
1081
+ zusätzliche Bereinigung der erfassten Ausgabe vornehmen, indem Sie `re.sub(r'~.*\r', '', buf, 0, re.M)` verwenden.
1082
+
1083
+ Aber dann haben wir einen Hilfskontextmanager-Wrapper, der sich automatisch um alles kümmert, unabhängig davon, ob er
1084
+ einige "*.*.*.*" enthält oder nicht:
1085
+
1086
+ ```python
1087
+ from transformers.testing_utils import CaptureStdout
1088
+
1089
+ with CaptureStdout() as cs:
1090
+ function_that_writes_to_stdout()
1091
+ print(cs.out)
1092
+ ```
1093
+
1094
+ Hier ist ein vollständiges Testbeispiel:
1095
+
1096
+ ```python
1097
+ from transformers.testing_utils import CaptureStdout
1098
+
1099
+ msg = "Secret message\r"
1100
+ final = "Hello World"
1101
+ with CaptureStdout() as cs:
1102
+ print(msg + final)
1103
+ assert cs.out == final + "\n", f"captured: {cs.out}, expecting {final}"
1104
+ ```
1105
+
1106
+ Wenn Sie `stderr` aufzeichnen möchten, verwenden Sie stattdessen die Klasse `CaptureStderr`:
1107
+
1108
+ ```python
1109
+ from transformers.testing_utils import CaptureStderr
1110
+
1111
+ with CaptureStderr() as cs:
1112
+ function_that_writes_to_stderr()
1113
+ print(cs.err)
1114
+ ```
1115
+
1116
+ Wenn Sie beide Streams auf einmal erfassen müssen, verwenden Sie die übergeordnete Klasse `CaptureStd`:
1117
+
1118
+ ```python
1119
+ from transformers.testing_utils import CaptureStd
1120
+
1121
+ with CaptureStd() as cs:
1122
+ function_that_writes_to_stdout_and_stderr()
1123
+ print(cs.err, cs.out)
1124
+ ```
1125
+
1126
+ Um das Debuggen von Testproblemen zu erleichtern, geben diese Kontextmanager standardmäßig die aufgezeichneten Streams beim Verlassen
1127
+ aus dem Kontext wieder.
1128
+
1129
+
1130
+ ### Erfassen von Logger-Streams
1131
+
1132
+ Wenn Sie die Ausgabe eines Loggers validieren müssen, können Sie `CaptureLogger` verwenden:
1133
+
1134
+ ```python
1135
+ from transformers import logging
1136
+ from transformers.testing_utils import CaptureLogger
1137
+
1138
+ msg = "Testing 1, 2, 3"
1139
+ logging.set_verbosity_info()
1140
+ logger = logging.get_logger("transformers.models.bart.tokenization_bart")
1141
+ with CaptureLogger(logger) as cl:
1142
+ logger.info(msg)
1143
+ assert cl.out, msg + "\n"
1144
+ ```
1145
+
1146
+ ### Testen mit Umgebungsvariablen
1147
+
1148
+ Wenn Sie die Auswirkungen von Umgebungsvariablen für einen bestimmten Test testen möchten, können Sie einen Hilfsdekorator verwenden
1149
+ `transformers.testing_utils.mockenv`
1150
+
1151
+ ```python
1152
+ from transformers.testing_utils import mockenv
1153
+
1154
+
1155
+ class HfArgumentParserTest(unittest.TestCase):
1156
+ @mockenv(TRANSFORMERS_VERBOSITY="error")
1157
+ def test_env_override(self):
1158
+ env_level_str = os.getenv("TRANSFORMERS_VERBOSITY", None)
1159
+ ```
1160
+
1161
+ Manchmal muss ein externes Programm aufgerufen werden, was die Einstellung von `PYTHONPATH` in `os.environ` erfordert, um mehrere lokale Pfade einzuschließen.
1162
+ mehrere lokale Pfade. Eine Hilfsklasse `transformers.test_utils.TestCasePlus` hilft Ihnen dabei:
1163
+
1164
+ ```python
1165
+ from transformers.testing_utils import TestCasePlus
1166
+
1167
+
1168
+ class EnvExampleTest(TestCasePlus):
1169
+ def test_external_prog(self):
1170
+ env = self.get_env()
1171
+ # now call the external program, passing `env` to it
1172
+ ```
1173
+
1174
+ Je nachdem, ob die Testdatei in der Testsuite `tests` oder in `examples` war, wird sie korrekt eingerichtet
1175
+ `env[PYTHONPATH]` eines dieser beiden Verzeichnisse und auch das `src` Verzeichnis, um sicherzustellen, dass der Test gegen das aktuelle
1176
+ um sicherzustellen, dass der Test mit dem aktuellen Projektarchiv durchgeführt wird, und schließlich mit dem, was in `env[PYTHONPATH]` bereits eingestellt war, bevor der Test aufgerufen wurde.
1177
+ wenn überhaupt.
1178
+
1179
+ Diese Hilfsmethode erstellt eine Kopie des Objekts `os.environ`, so dass das Original intakt bleibt.
1180
+
1181
+
1182
+ ### Reproduzierbare Ergebnisse erhalten
1183
+
1184
+ In manchen Situationen möchten Sie vielleicht die Zufälligkeit Ihrer Tests beseitigen. Um identische, reproduzierbare Ergebnisse zu erhalten, müssen Sie
1185
+ müssen Sie den Seed festlegen:
1186
+
1187
+ ```python
1188
+ seed = 42
1189
+
1190
+ # python RNG
1191
+ import random
1192
+
1193
+ random.seed(seed)
1194
+
1195
+ # pytorch RNGs
1196
+ import torch
1197
+
1198
+ torch.manual_seed(seed)
1199
+ torch.backends.cudnn.deterministic = True
1200
+ if torch.cuda.is_available():
1201
+ torch.cuda.manual_seed_all(seed)
1202
+
1203
+ # numpy RNG
1204
+ import numpy as np
1205
+
1206
+ np.random.seed(seed)
1207
+
1208
+ # tf RNG
1209
+ tf.random.set_seed(seed)
1210
+ ```
1211
+
1212
+ ### Tests debuggen
1213
+
1214
+ Um einen Debugger an der Stelle zu starten, an der die Warnung auftritt, gehen Sie wie folgt vor:
1215
+
1216
+ ```bash
1217
+ pytest tests/utils/test_logging.py -W error::UserWarning --pdb
1218
+ ```
1219
+
1220
+ ## Arbeiten mit Github-Aktionen-Workflows
1221
+
1222
+ Um einen CI-Job für einen Self-Push-Workflow auszulösen, müssen Sie:
1223
+
1224
+ 1. Erstellen Sie einen neuen Zweig auf `transformers` Ursprung (keine Gabelung!).
1225
+ 2. Der Name der Verzweigung muss entweder mit `ci_` oder `ci-` beginnen (`main` löst ihn auch aus, aber wir können keine PRs auf
1226
+ `main`). Es wird auch nur für bestimmte Pfade ausgelöst - Sie können die aktuelle Definition finden, falls sie
1227
+ falls sie sich seit der Erstellung dieses Dokuments geändert hat [hier](https://github.com/huggingface/transformers/blob/main/.github/workflows/self-push.yml) unter *push:*
1228
+ 3. Erstellen Sie einen PR von diesem Zweig.
1229
+ 4. Dann können Sie sehen, wie der Job erscheint [hier](https://github.com/huggingface/transformers/actions/workflows/self-push.yml). Er wird möglicherweise nicht sofort ausgeführt, wenn es
1230
+ ein Backlog vorhanden ist.
1231
+
1232
+
1233
+
1234
+
1235
+ ## Testen experimenteller CI-Funktionen
1236
+
1237
+ Das Testen von CI-Funktionen kann potenziell problematisch sein, da es die normale CI-Funktion beeinträchtigen kann. Wenn also eine
1238
+ neue CI-Funktion hinzugefügt werden soll, sollte dies wie folgt geschehen.
1239
+
1240
+ 1. Erstellen Sie einen neuen Auftrag, der die zu testende Funktion testet.
1241
+ 2. Der neue Job muss immer erfolgreich sein, so dass er uns ein grünes ✓ gibt (Details unten).
1242
+ 3. Lassen Sie ihn einige Tage lang laufen, um zu sehen, dass eine Vielzahl verschiedener PR-Typen darauf laufen (Benutzer-Gabelzweige,
1243
+ nicht geforkte Zweige, Zweige, die von github.com UI direct file edit stammen, verschiedene erzwungene Pushes, etc. - es gibt
1244
+ es gibt so viele), während Sie die Protokolle des experimentellen Jobs überwachen (nicht den gesamten Job grün, da er absichtlich immer
1245
+ grün)
1246
+ 4. Wenn klar ist, dass alles in Ordnung ist, fügen Sie die neuen Änderungen in die bestehenden Jobs ein.
1247
+
1248
+ Auf diese Weise wird der normale Arbeitsablauf nicht durch Experimente mit der CI-Funktionalität selbst beeinträchtigt.
1249
+
1250
+ Wie können wir nun dafür sorgen, dass der Auftrag immer erfolgreich ist, während die neue CI-Funktion entwickelt wird?
1251
+
1252
+ Einige CIs, wie TravisCI, unterstützen ignore-step-failure und melden den gesamten Job als erfolgreich, aber CircleCI und
1253
+ Github Actions unterstützen dies zum jetzigen Zeitpunkt nicht.
1254
+
1255
+ Sie können also die folgende Abhilfe verwenden:
1256
+
1257
+ 1. Setzen Sie `set +euo pipefail` am Anfang des Ausführungsbefehls, um die meisten potenziellen Fehler im Bash-Skript zu unterdrücken.
1258
+ 2. Der letzte Befehl muss ein Erfolg sein: `echo "done"` oder einfach `true` reicht aus.
1259
+
1260
+ Hier ist ein Beispiel:
1261
+
1262
+ ```yaml
1263
+ - run:
1264
+ name: run CI experiment
1265
+ command: |
1266
+ set +euo pipefail
1267
+ echo "setting run-all-despite-any-errors-mode"
1268
+ this_command_will_fail
1269
+ echo "but bash continues to run"
1270
+ # emulate another failure
1271
+ false
1272
+ # but the last command must be a success
1273
+ echo "during experiment do not remove: reporting success to CI, even if there were failures"
1274
+ ```
1275
+
1276
+ Für einfache Befehle können Sie auch Folgendes tun:
1277
+
1278
+ ```bash
1279
+ cmd_that_may_fail || true
1280
+ ```
1281
+
1282
+ Wenn Sie mit den Ergebnissen zufrieden sind, integrieren Sie den experimentellen Schritt oder Job natürlich in den Rest der normalen Jobs,
1283
+ Entfernen Sie dabei `set +euo pipefail` oder andere Dinge, die Sie eventuell hinzugefügt haben, um sicherzustellen, dass der experimentelle Auftrag nicht
1284
+ den normalen CI-Betrieb nicht beeinträchtigt.
1285
+
1286
+ Dieser ganze Prozess wäre viel einfacher gewesen, wenn wir nur etwas wie `allow-failure` für den
1287
+ experimentellen Schritt festlegen könnten und ihn scheitern lassen würden, ohne den Gesamtstatus der PRs zu beeinträchtigen. Aber wie bereits erwähnt, haben CircleCI und
1288
+ Github Actions dies im Moment nicht unterstützen.
1289
+
1290
+ Sie können in diesen CI-spezifischen Threads für diese Funktion stimmen und sehen, wo sie steht:
1291
+
1292
+ - [Github Actions:](https://github.com/actions/toolkit/issues/399)
1293
+ - [CircleCI:](https://ideas.circleci.com/ideas/CCI-I-344)