File size: 12,905 Bytes
ee6e328
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<!---
Copyright 2020 The HuggingFace Team. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
rendered properly in your Markdown viewer.

-->

# Pull Request에 λŒ€ν•œ 검사 [[checks-on-a-pull-request]]

πŸ€— Transformersμ—μ„œ Pull Requestλ₯Ό μ—΄ λ•Œ, 기쑴에 μžˆλŠ” 것을 λ§κ°€λœ¨λ¦¬μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μƒλ‹Ήν•œ 수의 검사가 μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²€μ‚¬λŠ” λ‹€μŒκ³Ό 같은 λ„€ 가지 μœ ν˜•μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€:
- 일반적인 ν…ŒμŠ€νŠΈ
- λ¬Έμ„œ λΉŒλ“œ
- μ½”λ“œ 및 λ¬Έμ„œ μŠ€νƒ€μΌ
- 일반 μ €μž₯μ†Œ 일관성

이 λ¬Έμ„œμ—μ„œλŠ” μ΄λŸ¬ν•œ λ‹€μ–‘ν•œ 검사와 κ·Έ 이유λ₯Ό μ„€λͺ…ν•˜κ³ , PRμ—μ„œ ν•˜λ‚˜ μ΄μƒμ˜ 검사가 μ‹€νŒ¨ν•œ 경우 λ‘œμ»¬μ—μ„œ μ–΄λ–»κ²Œ λ””λ²„κ·Έν•˜λŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

참고둜, μ΄λŸ¬ν•œ 검사λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 개발 μ„€μΉ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€:

```bash
pip install transformers[dev]
```

λ˜λŠ” Transformers μ €μž₯μ†Œ 내에 νŽΈμ§‘ κ°€λŠ₯ν•œ μ„€μΉ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€:

```bash
pip install -e .[dev]
```

Transformers의 선택적 쒅속성 μˆ˜κ°€ 많이 λŠ˜μ–΄λ‚¬κΈ° λ•Œλ¬Έμ— 개발 μ„€μΉ˜λ₯Ό μ‹€νŒ¨ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 개발 μ„€μΉ˜κ°€ μ‹€νŒ¨ν•˜λŠ” 경우, μž‘μ—… 쀑인 Deep Learning ν”„λ ˆμž„μ›Œν¬ (PyTorch, TensorFlow 및/λ˜λŠ” Flax)λ₯Ό μ„€μΉ˜ν•˜κ³  λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ„Έμš”.

```bash
pip install transformers[quality]
```

νŽΈμ§‘ κ°€λŠ₯ν•œ μ„€μΉ˜μ˜ κ²½μš°λŠ” λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ„Έμš”.

```bash
pip install -e .[quality]
```


## ν…ŒμŠ€νŠΈ [[tests]]

`ci/circleci: run_tests_`둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  μž‘μ—…μ€ Transformers ν…ŒμŠ€νŠΈ λͺ¨μŒμ˜ 일뢀λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ€ νŠΉμ • ν™˜κ²½μ—μ„œ 일뢀 λΌμ΄λΈŒλŸ¬λ¦¬μ— 쀑점을 λ‘‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ `ci/circleci: run_tests_pipelines_tf`λŠ” TensorFlow만 μ„€μΉ˜λœ ν™˜κ²½μ—μ„œ νŒŒμ΄ν”„λΌμΈ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ λͺ¨λ“ˆμ—μ„œ μ‹€μ œλ‘œ λ³€κ²½ 사항이 없을 λ•Œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄, ν…ŒμŠ€νŠΈ λͺ¨μŒμ˜ μΌλΆ€λ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€. 라이브러리의 λ³€κ²½ 전후에 λŒ€ν•œ 차이λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ μœ ν‹Έλ¦¬ν‹°κ°€ μ‹€ν–‰λ˜κ³ , ν•΄λ‹Ή 차이에 영ν–₯을 λ°›λŠ” ν…ŒμŠ€νŠΈκ°€ μ„ νƒλ©λ‹ˆλ‹€. 이 μœ ν‹Έλ¦¬ν‹°λŠ” λ‘œμ»¬μ—μ„œ λ‹€μŒκ³Ό 같이 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

```bash
python utils/tests_fetcher.py
```

Transformers μ €μž₯μ†Œμ˜ μ΅œμƒλ‹¨μ—μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 μœ ν‹Έλ¦¬ν‹°λŠ” λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:

1. λ³€κ²½ 사항이 μžˆλŠ” νŒŒμΌλ§ˆλ‹€ λ³€κ²½ 사항이 μ½”λ“œμΈμ§€ 주석 λ˜λŠ” λ¬Έμ„œ λ¬Έμžμ—΄μΈμ§€ ν™•μΈν•©λ‹ˆλ‹€. μ‹€μ œ μ½”λ“œ 변경이 μžˆλŠ” 파일만 μœ μ§€λ©λ‹ˆλ‹€.
2. μ†ŒμŠ€ μ½”λ“œ 파일의 각 νŒŒμΌμ— λŒ€ν•΄ μž¬κ·€μ μœΌλ‘œ 영ν–₯을 μ£ΌλŠ” λͺ¨λ“  νŒŒμΌμ„ μ œκ³΅ν•˜λŠ” λ‚΄λΆ€ 맡을 μž‘μ„±ν•©λ‹ˆλ‹€. λͺ¨λ“ˆ Bκ°€ λͺ¨λ“ˆ Aλ₯Ό κ°€μ Έμ˜€λ©΄ λͺ¨λ“ˆ AλŠ” λͺ¨λ“ˆ B에 영ν–₯을 μ€λ‹ˆλ‹€. μž¬κ·€μ μΈ 영ν–₯μ—λŠ” 각 λͺ¨λ“ˆμ΄ 이전 λͺ¨λ“ˆμ„ κ°€μ Έμ˜€λŠ” λͺ¨λ“ˆ 체인이 ν•„μš”ν•©λ‹ˆλ‹€.
3. 단계 1μ—μ„œ μˆ˜μ§‘ν•œ νŒŒμΌμ— 이 맡을 μ μš©ν•˜μ—¬ PR에 영ν–₯을 λ°›λŠ” λͺ¨λΈ 파일 λͺ©λ‘μ„ μ–»μŠ΅λ‹ˆλ‹€.
4. 각 νŒŒμΌμ„ ν•΄λ‹Ήν•˜λŠ” ν…ŒμŠ€νŠΈ νŒŒμΌμ— λ§€ν•‘ν•˜κ³  μ‹€ν–‰ν•  ν…ŒμŠ€νŠΈ λͺ©λ‘μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.

λ‘œμ»¬μ—μ„œ 슀크립트λ₯Ό μ‹€ν–‰ν•˜λ©΄ 단계 1, 3 및 4의 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜μ—¬ μ‹€ν–‰λ˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν¬λ¦½νŠΈλŠ” λ˜ν•œ `test_list.txt`λΌλŠ” νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ μ‹€ν–‰ν•  ν…ŒμŠ€νŠΈ λͺ©λ‘μ„ ν¬ν•¨ν•˜λ©°, λ‹€μŒ λͺ…λ ΉμœΌλ‘œ ν•΄λ‹Ή ν…ŒμŠ€νŠΈλ₯Ό λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

```bash
python -m pytest -n 8 --dist=loadfile -rA -s $(cat test_list.txt)
```

잘λͺ»λœ 사항이 λˆ„λ½λ˜μ—ˆμ„ 경우, 전체 ν…ŒμŠ€νŠΈ λͺ¨μŒλ„ 맀일 μ‹€ν–‰λ©λ‹ˆλ‹€.

## λ¬Έμ„œ λΉŒλ“œ [[documentation-build]]

`build_pr_documentation` μž‘μ—…μ€ λ¬Έμ„œλ₯Ό λΉŒλ“œν•˜κ³  미리 보기λ₯Ό μƒμ„±ν•˜μ—¬ PR이 λ³‘ν•©λœ ν›„ λͺ¨λ“  것이 μ œλŒ€λ‘œ λ³΄μ΄λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ‘œλ΄‡μ€ PR에 λ¬Έμ„œ 미리보기 링크λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. PRμ—μ„œ λ§Œλ“  λ³€κ²½ 사항은 μžλ™μœΌλ‘œ 미리보기에 μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€. λ¬Έμ„œ λΉŒλ“œμ— μ‹€νŒ¨ν•œ 경우 **μ„ΈλΆ€ 정보**λ₯Ό ν΄λ¦­ν•˜μ—¬ μ–΄λ””μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν–ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 였λ₯˜λŠ” 주둜 `toctree`에 λˆ„λ½λœ 파일과 같이 κ°„λ‹¨ν•œ 였λ₯˜μž…λ‹ˆλ‹€.

λ‘œμ»¬μ—μ„œ λ¬Έμ„œλ₯Ό λΉŒλ“œν•˜κ±°λ‚˜ 미리 λ³Ό 경우, docs ν΄λ”μ˜ [`README.md`](https://github.com/huggingface/transformers/tree/main/docs)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

## μ½”λ“œ 및 λ¬Έμ„œ μŠ€νƒ€μΌ [[code-and-documentation-style]]

`black`κ³Ό `ruff`λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ†ŒμŠ€ 파일, 예제 및 ν…ŒμŠ€νŠΈμ— μ½”λ“œ ν˜•μ‹μ„ μ μš©ν•©λ‹ˆλ‹€. λ˜ν•œ, `utils/style_doc.py`μ—μ„œ λ¬Έμ„œ λ¬Έμžμ—΄κ³Ό `rst` 파일의 ν˜•μ‹, 그리고 Transformers의 `__init__.py` νŒŒμΌμ—μ„œ μ‹€ν–‰λ˜λŠ” μ§€μ—°λœ μž„ν¬νŠΈμ˜ μˆœμ„œμ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜ 도ꡬ가 μžˆμŠ΅λ‹ˆλ‹€. 이 λͺ¨λ“  것은 λ‹€μŒμ„ μ‹€ν–‰ν•¨μœΌλ‘œμ¨ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

```bash
make style
```

CIλŠ” μ΄λŸ¬ν•œ 사항이 `ci/circleci: check_code_quality` 검사 λ‚΄μ—μ„œ μ μš©λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ˜ν•œ `ruff`도 μ‹€ν–‰λ˜λ©°, μ •μ˜λ˜μ§€ μ•Šμ€ λ³€μˆ˜λ‚˜ μ‚¬μš©λ˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό λ°œκ²¬ν•˜λ©΄ κ²½κ³ ν•©λ‹ˆλ‹€. 이 검사λ₯Ό λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•˜λ €λ©΄ λ‹€μŒμ„ μ‚¬μš©ν•˜μ„Έμš”:

```bash
make quality
```

이 μž‘μ—…μ€ λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ  수 μžˆμœΌλ―€λ‘œ ν˜„μž¬ λΈŒλžœμΉ˜μ—μ„œ μˆ˜μ •ν•œ νŒŒμΌμ— λŒ€ν•΄μ„œλ§Œ λ™μΌν•œ μž‘μ—…μ„ μ‹€ν–‰ν•˜λ €λ©΄ λ‹€μŒμ„ μ‹€ν–‰ν•˜μ„Έμš”.

```bash
make fixup
```

이 λͺ…령은 ν˜„μž¬ λΈŒλžœμΉ˜μ—μ„œ μˆ˜μ •ν•œ νŒŒμΌμ— λŒ€ν•œ λͺ¨λ“  좔가적인 검사도 μ‹€ν–‰ν•©λ‹ˆλ‹€. 이제 이듀을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

## μ €μž₯μ†Œ 일관성 [[repository-consistency]]

μ΄λŠ” PR이 μ €μž₯μ†Œλ₯Ό 정상적인 μƒνƒœλ‘œ μœ μ§€ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” λͺ¨λ“  ν…ŒμŠ€νŠΈλ₯Ό λͺ¨μ€ 것이며, `ci/circleci: check_repository_consistency` κ²€μ‚¬μ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. λ‹€μŒμ„ μ‹€ν–‰ν•¨μœΌλ‘œμ¨ λ‘œμ»¬μ—μ„œ 이 검사λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

```bash
make repo-consistency
```

이 κ²€μ‚¬λŠ” λ‹€μŒμ„ ν™•μΈν•©λ‹ˆλ‹€.

- init에 μΆ”κ°€λœ λͺ¨λ“  객체가 λ¬Έμ„œν™”λ˜μ—ˆλŠ”μ§€ (`utils/check_repo.py`μ—μ„œ μˆ˜ν–‰)
- `__init__.py` 파일의 두 μ„Ήμ…˜μ— λ™μΌν•œ λ‚΄μš©μ΄ μžˆλŠ”μ§€ (`utils/check_inits.py`μ—μ„œ μˆ˜ν–‰)
- λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ λ³΅μ‚¬λœ μ½”λ“œκ°€ 원본과 μΌμΉ˜ν•˜λŠ”μ§€ (`utils/check_copies.py`μ—μ„œ μˆ˜ν–‰)
- λͺ¨λ“  ꡬ성 ν΄λž˜μŠ€μ— docstring에 μ–ΈκΈ‰λœ μœ νš¨ν•œ μ²΄ν¬ν¬μΈνŠΈκ°€ 적어도 ν•˜λ‚˜ μžˆλŠ”μ§€ (`utils/check_config_docstrings.py`μ—μ„œ μˆ˜ν–‰)
- λͺ¨λ“  ꡬ성 ν΄λž˜μŠ€κ°€ ν•΄λ‹Ήν•˜λŠ” λͺ¨λΈλ§ νŒŒμΌμ—μ„œ μ‚¬μš©λ˜λŠ” μ†μ„±λ§Œ ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ (`utils/check_config_attributes.py`μ—μ„œ μˆ˜ν–‰)
- README와 λ¬Έμ„œ 인덱슀의 λ²ˆμ—­μ΄ 메인 README와 λ™μΌν•œ λͺ¨λΈ λͺ©λ‘μ„ 가지고 μžˆλŠ”μ§€ (`utils/check_copies.py`μ—μ„œ μˆ˜ν–‰)
- λ¬Έμ„œμ˜ μžλ™ μƒμ„±λœ ν…Œμ΄λΈ”μ΄ μ΅œμ‹  μƒνƒœμΈμ§€ (`utils/check_table.py`μ—μ„œ μˆ˜ν–‰)
- λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” 선택적 쒅속성이 μ„€μΉ˜λ˜μ§€ μ•Šμ•˜λ”λΌλ„ λͺ¨λ“  객체가 μ‚¬μš© κ°€λŠ₯ν•œμ§€ (`utils/check_dummies.py`μ—μ„œ μˆ˜ν–‰)

μ΄λŸ¬ν•œ 검사가 μ‹€νŒ¨ν•˜λŠ” 경우, 처음 두 가지 ν•­λͺ©μ€ μˆ˜λ™μœΌλ‘œ μˆ˜μ •ν•΄μ•Ό ν•˜λ©°, λ‚˜λ¨Έμ§€ λ„€ 가지 ν•­λͺ©μ€ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ—¬ μžλ™μœΌλ‘œ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

```bash
make fix-copies
```

좔가적인 κ²€μ‚¬λŠ” μƒˆλ‘œμš΄ λͺ¨λΈμ„ μΆ”κ°€ν•˜λŠ” PR에 λŒ€ν•œ κ²ƒμœΌλ‘œ, 주둜 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

- μΆ”κ°€λœ λͺ¨λ“  λͺ¨λΈμ΄ Auto-mapping에 μžˆλŠ”μ§€ (`utils/check_repo.py`μ—μ„œ μˆ˜ν–‰)
<!-- TODO Sylvain, add a check that makes sure the common tests are implemented.-->
- λͺ¨λ“  λͺ¨λΈμ΄ μ˜¬λ°”λ₯΄κ²Œ ν…ŒμŠ€νŠΈλ˜μ—ˆλŠ”μ§€ (`utils/check_repo.py`μ—μ„œ μˆ˜ν–‰)

<!-- TODO Sylvain, add the following
- λͺ¨λ“  λͺ¨λΈμ΄ 메인 README, μ£Όμš” λ¬Έμ„œμ— μΆ”κ°€λ˜μ—ˆλŠ”μ§€
- μ‚¬μš©λœ λͺ¨λ“  μ²΄ν¬ν¬μΈνŠΈκ°€ μ‹€μ œλ‘œ Hub에 μ‘΄μž¬ν•˜λŠ”μ§€

-->

### 볡사본 확인 [[check-copies]]

Transformers λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λͺ¨λΈ μ½”λ“œμ— λŒ€ν•΄ 맀우 μ™„κ³ ν•˜λ©°, 각 λͺ¨λΈμ€ λ‹€λ₯Έ λͺ¨λΈμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  μ™„μ „νžˆ 단일 파일둜 κ΅¬ν˜„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜κΈ° μœ„ν•΄ νŠΉμ • λͺ¨λΈμ˜ μ½”λ“œ 볡사본이 원본과 μΌκ΄€λœ μƒνƒœλ‘œ μœ μ§€λ˜λŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 버그 μˆ˜μ •μ΄ ν•„μš”ν•œ 경우 λ‹€λ₯Έ λͺ¨λΈμ— 영ν–₯을 μ£ΌλŠ” λͺ¨λ“  λͺ¨λΈμ„ λ³Ό 수 있으며 μˆ˜μ •μ„ μ μš©ν• μ§€ μˆ˜μ •λœ 사본을 μ‚­μ œν• μ§€ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

<Tip>

파일이 λ‹€λ₯Έ 파일의 μ™„μ „ν•œ 사본인 경우 ν•΄λ‹Ή νŒŒμΌμ„ `utils/check_copies.py`의 `FULL_COPIES` μƒμˆ˜μ— 등둝해야 ν•©λ‹ˆλ‹€.

</Tip>

이 λ©”μ»€λ‹ˆμ¦˜μ€ `# Copied from xxx` ν˜•μ‹μ˜ 주석을 기반으둜 ν•©λ‹ˆλ‹€. `xxx`μ—λŠ” μ•„λž˜μ— λ³΅μ‚¬λ˜λŠ” 클래슀 λ˜λŠ” ν•¨μˆ˜μ˜ 전체 κ²½λ‘œκ°€ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ `RobertaSelfOutput`은 `BertSelfOutput` 클래슀의 λ³΅μ‚¬λ³Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ [μ—¬κΈ°](https://github.com/huggingface/transformers/blob/2bd7a27a671fd1d98059124024f580f8f5c0f3b5/src/transformers/models/roberta/modeling_roberta.py#L289)μ—μ„œ 주석이 μžˆμŠ΅λ‹ˆλ‹€:


```py
# Copied from transformers.models.bert.modeling_bert.BertSelfOutput
```

클래슀 전체에 μˆ˜μ •μ„ μ μš©ν•˜λŠ” λŒ€μ‹ μ— 볡사본과 κ΄€λ ¨μžˆλŠ” λ©”μ„œλ“œμ— μ μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ [μ—¬κΈ°](https://github.com/huggingface/transformers/blob/2bd7a27a671fd1d98059124024f580f8f5c0f3b5/src/transformers/models/roberta/modeling_roberta.py#L598)μ—μ„œ `RobertaPreTrainedModel._init_weights`κ°€ `BertPreTrainedModel`의 λ™μΌν•œ λ©”μ„œλ“œμ—μ„œ λ³΅μ‚¬λœ 것을 λ³Ό 수 있으며 ν•΄λ‹Ή 주석이 μžˆμŠ΅λ‹ˆλ‹€:

```py
# Copied from transformers.models.bert.modeling_bert.BertPreTrainedModel._init_weights
```

볡사본이 μ΄λ¦„λ§Œ λ‹€λ₯Έ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€: 예λ₯Ό λ“€μ–΄ `RobertaAttention`μ—μ„œ `BertSelfAttention` λŒ€μ‹  `RobertaSelfAttention`을 μ‚¬μš©ν•˜μ§€λ§Œ κ·Έ μ™Έμ—λŠ” μ½”λ“œκ°€ μ™„μ „νžˆ λ™μΌν•©λ‹ˆλ‹€: 이 λ•Œ `# Copied from`은 `Copied from xxx with foo->bar`와 같은 κ°„λ‹¨ν•œ λ¬Έμžμ—΄ λŒ€μ²΄λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  `foo` μΈμŠ€ν„΄μŠ€λ₯Ό `bar`둜 λ°”κΏ”μ„œ μ½”λ“œλ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€. [μ—¬κΈ°](https://github.com/huggingface/transformers/blob/2bd7a27a671fd1d98059124024f580f8f5c0f3b5/src/transformers/models/roberta/modeling_roberta.py#L304C1-L304C86)μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

```py
# Copied from transformers.models.bert.modeling_bert.BertAttention with Bert->Roberta
```

ν™”μ‚΄ν‘œ μ£Όλ³€μ—λŠ” 곡백이 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€(곡백이 λŒ€μ²΄ νŒ¨ν„΄μ˜ 일뢀인 κ²½μš°λŠ” μ˜ˆμ™Έμž…λ‹ˆλ‹€).

λŒ€μ²΄ νŒ¨ν„΄μ„ μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ—¬λŸ¬ νŒ¨ν„΄μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ `CamemberForMaskedLM`은 두 가지 λŒ€μ²΄ 사항을 가진 `RobertaForMaskedLM`의 λ³΅μ‚¬λ³Έμž…λ‹ˆλ‹€: `Roberta`λ₯Ό `Camembert`둜 λŒ€μ²΄ν•˜κ³  `ROBERTA`λ₯Ό `CAMEMBERT`둜 λŒ€μ²΄ν•©λ‹ˆλ‹€. [μ—¬κΈ°](https://github.com/huggingface/transformers/blob/15082a9dc6950ecae63a0d3e5060b2fc7f15050a/src/transformers/models/camembert/modeling_camembert.py#L929)μ—μ„œ 이것이 μ£Όμ„μœΌλ‘œ μ–΄λ–»κ²Œ κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

```py
# Copied from transformers.models.roberta.modeling_roberta.RobertaForMaskedLM with Roberta->Camembert, ROBERTA->CAMEMBERT
```

μˆœμ„œκ°€ μ€‘μš”ν•œ 경우(이전 μˆ˜μ •κ³Ό μΆ©λŒν•  수 μžˆλŠ” 경우) μˆ˜μ •μ€ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

<Tip>

μƒˆ 변경이 μ„œμ‹μ„ λ³€κ²½ν•˜λŠ” 경우(짧은 이름을 맀우 κΈ΄ μ΄λ¦„μœΌλ‘œ λ°”κΎΈλŠ” 경우) μžλ™ μ„œμ‹ 지정기λ₯Ό μ μš©ν•œ ν›„ 볡사본이 κ²€μ‚¬λ©λ‹ˆλ‹€.

</Tip>

νŒ¨ν„΄μ˜ λŒ€μ†Œλ¬Έμžκ°€ λ‹€λ₯Έ 경우(λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμžκ°€ 혼용된 λŒ€μ²΄ 양식) `all-casing` μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€. [μ—¬κΈ°](https://github.com/huggingface/transformers/blob/15082a9dc6950ecae63a0d3e5060b2fc7f15050a/src/transformers/models/mobilebert/modeling_mobilebert.py#L1237)μ—μ„œ `MobileBertForSequenceClassification`μ—μ„œ μ‚¬μš©λœ μ˜ˆμ‹œλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

```py
# Copied from transformers.models.bert.modeling_bert.BertForSequenceClassification with Bert->MobileBert all-casing
```

이 경우, μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 λ³΅μ‚¬λ©λ‹ˆλ‹€:
- `MobileBert`μ—μ„œ `Bert`둜(예: `MobileBertModel`을 initμ—μ„œ μ‚¬μš©ν•  λ•Œ)
- `mobilebert`μ—μ„œ `bert`둜(예: `self.mobilebert`λ₯Ό μ •μ˜ν•  λ•Œ)
- `MOBILEBERT`μ—μ„œ `BERT`둜(`MOBILEBERT_INPUTS_DOCSTRING` μƒμˆ˜μ—μ„œ)