File size: 25,243 Bytes
96e9536
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
<!--Copyright 2022 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

โš ๏ธ 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.

-->

# ์–ด๋–ป๊ฒŒ ๐Ÿค— Transformers ๋ชจ๋ธ์„ TensorFlow๋กœ ๋ณ€ํ™˜ํ•˜๋‚˜์š”? [[how-to-convert-a-transformers-model-to-tensorflow]]

๐Ÿค— Transformers์—์„œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•  ๋•Œ ๊ทธ๋“ค์˜ ๊ฐ•์ ์„ ์œ ์—ฐํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ชจ๋ธ ๋ณ„๋กœ ํ˜ธํ™˜์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์  ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์€ ๊ธฐ์กด ๋ชจ๋ธ์— TensorFlow ํ˜ธํ™˜์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด [์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๋ชจ๋ธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ](add_new_model)๋ณด๋‹ค๋„ ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! 

๋งŒ์•ฝ ๋Œ€๊ทœ๋ชจ TensorFlow ๋ชจ๋ธ์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๋ ค๊ฑฐ๋‚˜, ์˜คํ”ˆ ์†Œ์Šค์— ํฐ ๊ธฐ์—ฌ๋ฅผ ํ•˜๋ ค๊ฑฐ๋‚˜, ์„ ํƒํ•œ ๋ชจ๋ธ์— Tensorflow๋ฅผ ํ™œ์šฉํ•˜๋ คํ•œ๋‹ค๋ฉด, ์ด ์•ˆ๋‚ด์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š” Hugging Face ํŒ€์˜ ์ตœ์†Œํ•œ์˜ ๊ฐ๋… ์•„๋ž˜์—์„œ ๐Ÿค— Transformers์—์„œ ์‚ฌ์šฉ๋˜๋Š” TensorFlow ๋ชจ๋ธ ๊ฐ€์ค‘์น˜์™€/๋˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์ธ ์—ฌ๋Ÿฌ๋ถ„์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. 
์ƒˆ๋กœ์šด ๋ชจ๋ธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์ด ์•„๋‹ˆ์ง€๋งŒ, ์ด ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด ์กฐ๊ธˆ ๋œ ํž˜๋“ค๊ณ  ํ›จ์”ฌ ์‰ฌ์šด ์ž‘์—…์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
๋ชจ๋‘์˜ ๊ฒฝํ—˜์„ ๋ชจ์œผ๋Š” ๊ฒƒ์€ ์ด ์ž‘์—…์„ ์ ์ฐจ์ ์œผ๋กœ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๊ฐ€์ด๋“œ๋ฅผ ๊ฐœ์„ ์‹œํ‚ฌ๋งŒํ•œ ์ œ์•ˆ์ด ๋– ์˜ค๋ฅด๋ฉด ๊ณต์œ ํ•˜์‹œ๋Š”๊ฑธ ์ ๊ทน์ ์œผ๋กœ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค!

๋” ๊นŠ์ด ์•Œ์•„๋ณด๊ธฐ ์ „์—, ๐Ÿค— Transformers๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ž๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:
- [๐Ÿค— Transformers์˜ ์ผ๋ฐ˜ ๊ฐœ์š”](add_new_model#general-overview-of-transformers)
- [Hugging Face์˜ TensorFlow ์ฒ ํ•™](https://huggingface.co/blog/tensorflow-philosophy)

์ด ๊ฐ€์ด๋“œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” ์ƒˆ๋กœ์šด TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹จ๊ณ„, Pytorch๋ฅผ TensorFlow ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ ˆ์ฐจ ๋ฐ ML ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•ด๋ด…์‹œ๋‹ค!

<Tip>

์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชจ๋ธ์ด ์ด๋ฏธ ํ•ด๋‹นํ•˜๋Š” TensorFlow ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๋‚˜์š”?

์„ ํƒํ•œ ๋ชจ๋ธ([์˜ˆ](https://huggingface.co/bert-base-uncased/blob/main/config.json#L14))์˜ `config.json`์˜ `model_type` ํ•„๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”. ๐Ÿค— Transformers์˜ ํ•ด๋‹น ๋ชจ๋ธ ํด๋”์—๋Š” "modeling_tf"๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ชจ๋ธ์—๋Š” ํ•ด๋‹น TensorFlow ์•„ํ‚คํ…์ฒ˜([์˜ˆ](https://github.com/huggingface/transformers/tree/main/src/transformers/models/bert))๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

</Tip>

## TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ [[step-by-step-guide-to add-tensorFlow-model-architecture-code]]

๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์ง„ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์„ค๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. 
๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” [๐Ÿค— Transformers ์ผ๋ฐ˜ ๊ฐœ์š”](add_new_model#general-overview-of-transformers)์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ผ๊ด€๋œ ์„ค๊ณ„ ์„ ํƒ์— ๋”ฐ๋ผ์•ผ์ง€๋งŒ ๐Ÿค— Transformers๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•  ๊ฒƒ์ด๋ผ๋Š” ํ™•๊ณ ํ•œ ์˜๊ฒฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์„ ํ†ตํ•ด TensorFlow ๋ชจ๋ธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์•Œ๋ ค ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

- ์ด๋ฏธ ์žˆ๋Š”๊ฑธ ๋‹ค์‹œ ๊ฐœ๋ฐœํ•˜๋ ค ํ•˜์ง€ ๋งˆ์„ธ์š”! ์ตœ์†Œํ•œ 2๊ฐœ์˜ ์ด๋ฏธ ๊ตฌํ˜„๋œ ๋ชจ๋ธ์„ ๋Œ€๊ฐœ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ชจ๋ธ๊ณผ ๊ธฐ๋Šฅ์ƒ ๋™์ผํ•œ Pytorch ๋ชจ๋ธ ํ•˜๋‚˜์™€ ๊ฐ™์€ ๋ฌธ์ œ ์œ ํ˜•์„ ํ’€๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ TensorFlow ๋ชจ๋ธ ํ•˜๋‚˜๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.
- ์šฐ์ˆ˜ํ•œ ๋ชจ๋ธ ๊ตฌํ˜„์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ์•„๋ฆ„๋‹ต๋‹ค๋Š” ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ๋””๋ฒ„๊น… ๋ฐ ๊ฐœ์„ ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. TensorFlow ๊ตฌํ˜„์—์„œ ๋‹ค๋ฅธ ๋ชจ๋ธ๋“ค๊ณผ ํŒจํ„ด์„ ๋˜‘๊ฐ™์ด ํ•˜๊ณ  Pytorch ๊ตฌํ˜„๊ณผ์˜ ๋ถˆ์ผ์น˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ ์—…๋ฌด๋ฅผ ์‰ฝ๊ฒŒ ํ•œ๋‹ค๋ฉด, ๊ธฐ์—ฌํ•œ ์ฝ”๋“œ๊ฐ€ ์˜ค๋ž˜๋„๋ก ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ํ•„์š”ํ•˜๋‹ค๋ฉด ๋„์›€์„ ์š”์ฒญํ•˜์„ธ์š”! ๐Ÿค— Transformers ํŒ€์€ ์—ฌ๋Ÿฌ๋ถ„์„ ๋•๊ธฐ ์œ„ํ•ด ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ง๋ฉดํ•œ ๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ด๋ฏธ ์ฐพ์€ ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฐœ๋žต์ ์œผ๋กœ ์จ๋ณด๋ฉด:
1. ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๋ชจ๋ธ ์„ ํƒ
2. transformers ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ค€๋น„
3. (์„ ํƒ ์‚ฌํ•ญ) ์ด๋ก ์  ์ธก๋ฉด ๋ฐ ๊ธฐ์กด ๊ตฌํ˜„ ์ดํ•ด
4. ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„
5. ๋ชจ๋ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„
6. PR (pull request) ์ œ์ถœ
7. (์„ ํƒ ์‚ฌํ•ญ) ๋ฐ๋ชจ ๋นŒ๋“œ ๋ฐ ๊ณต์œ 

### 1.-3. ๋ชจ๋ธ ๊ธฐ์—ฌ ์ค€๋น„ [[1.-3.-prepare-your-model-contribution]]

**1. ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๋ชจ๋ธ ์„ ํƒ**

์šฐ์„  ๊ธฐ๋ณธ ์‚ฌํ•ญ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
ํŠน์ • ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๊ด€์‹ฌ ์—†๋Š” ๊ฒฝ์šฐ, ๐Ÿค— Transformers ํŒ€์—๊ฒŒ ์ œ์•ˆ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜ํ–ฅ๋ ฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. 
์šฐ๋ฆฌ๋Š” TensorFlow์—์„œ ๋น ์ ธ ์žˆ๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ์ด๋Œ์–ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. 
TensorFlow์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋ธ์ด ์ด๋ฏธ ๐Ÿค— Transformers์— TensorFlow ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„์ด ์žˆ์ง€๋งŒ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, 
์ด ํŽ˜์ด์ง€์˜ [๊ฐ€์ค‘์น˜ ์ถ”๊ฐ€ ์„น์…˜](#adding-tensorflow-weights-to-hub)์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์ด ์•ˆ๋‚ด์„œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ TensorFlow ๋ฒ„์ „์˜ *BrandNewBert*([๊ฐ€์ด๋“œ](add_new_model)์™€ ๋™์ผํ•œ ์˜ˆ์ œ)๋ฅผ ๊ธฐ์—ฌํ•˜๋ ค๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

<Tip>

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜์— ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. 
`BrandNewBert`๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ
[pull request GitHub ํŽ˜์ด์ง€](https://github.com/huggingface/transformers/pulls?q=is%3Apr)์—์„œ TensorFlow ๊ด€๋ จ pull request๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

</Tip>

**2. transformers ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ค€๋น„**


๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•œ ํ›„, ๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์˜๋„๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด Draft PR์„ ์—ฌ์„ธ์š”. ์•„๋ž˜ ์ง€์นจ๋Œ€๋กœ ํ•˜์‹œ๋ฉด ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ  Draft PR์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. 'Fork' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ [๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ](https://github.com/huggingface/transformers)๋ฅผ ํฌํฌํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด GitHub ์‚ฌ์šฉ์ž ๊ณ„์ •์— ์ฝ”๋“œ์˜ ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


2. `transformers` ํฌํฌ๋ฅผ ๋กœ์ปฌ ๋””์Šคํฌ์— ํด๋ก ํ•˜๊ณ  ์›๋ณธ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์›๊ฒฉ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋กœ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

```bash
git clone https://github.com/[your Github handle]/transformers.git
cd transformers
git remote add upstream https://github.com/huggingface/transformers.git
```

3. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```bash
python -m venv .env
source .env/bin/activate
pip install -e ".[dev]"
```

์šด์˜ ์ฒด์ œ์— ๋”ฐ๋ผ์„œ Transformers์˜ ์„ ํƒ์  ์ข…์†์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์œ„ ๋ช…๋ น์ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ TensorFlow๋ฅผ ์„ค์น˜ํ•œ ํ›„ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”.

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

**์ฐธ๊ณ :** CUDA๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ชจ๋ธ์ด CPU์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ๋งŒ๋“œ๋ ค๋Š” ๊ธฐ๋Šฅ์ด ์ž˜ ํ‘œํ˜„๋˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

```bash
git checkout -b add_tf_brand_new_bert
```

5. ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํŽ˜์น˜(fetch)ํ•˜๊ณ  ๋ฆฌ๋ฒ ์ด์Šคํ•˜์„ธ์š”.

```bash
git fetch upstream
git rebase upstream/main
```

6. `transformers/src/models/brandnewbert/`์— `modeling_tf_brandnewbert.py`๋ผ๋Š” ๋นˆ `.py` ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์ด ํŒŒ์ผ์ด TensorFlow ๋ชจ๋ธ ํŒŒ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

7. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณ„์ •์— ํ‘ธ์‹œํ•˜์„ธ์š”.

```bash
git add .
git commit -m "initial commit"
git push -u origin add_tf_brand_new_bert
```

8. ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ GitHub์—์„œ ํฌํฌ๋œ ์›น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. "Pull request"๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. Hugging Face ํŒ€์˜ GitHub ID๋ฅผ ๋ฆฌ๋ทฐ์–ด๋กœ ์ถ”๊ฐ€ํ•ด์„œ, ์•ž์œผ๋กœ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด Hugging Face ํŒ€์ด ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


9. GitHub Pull Requests ํŽ˜์ด์ง€์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” "Convert to draft"๋ฅผ ํด๋ฆญํ•˜์—ฌ PR์„ ์ดˆ์•ˆ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”.

์ด์ œ ๐Ÿค— Transformers์—์„œ *BrandNewBert*๋ฅผ TensorFlow๋กœ ๋ณ€ํ™˜ํ•  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.


**3. (์„ ํƒ ์‚ฌํ•ญ) ์ด๋ก ์  ์ธก๋ฉด ๋ฐ ๊ธฐ์กด ๊ตฌํ˜„ ์ดํ•ด**


*BrandNewBert*์ฒ˜๋Ÿผ ์ž์„ธํ•œ ๊ธ€์ด ์žˆ๋‹ค๋ฉด ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋…ผ๋ฌธ์„ ์ฝ๋Š”๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”! ๋ชฉํ‘œ๋Š” ๋…ผ๋ฌธ์˜ ์‹ฌ๋„์žˆ๋Š” ์ด๋ก ์  ์ดํ•ด๊ฐ€ ์•„๋‹ˆ๋ผ TensorFlow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๐Ÿค— Transformers์— ๋ชจ๋ธ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•„์ˆ˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‹œ๊ฐ„์„ ์ด๋ก ์  ์ดํ•ด์— ํˆฌ์žํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์‹ค์šฉ์ ์ธ ์ธก๋ฉด์—์„œ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๋ชจ๋ธ ๋ฌธ์„œ ํŽ˜์ด์ง€(e.g. [model docs for BERT](model_doc/bert))์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๋ชจ๋ธ์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ดํ•ดํ•œ ํ›„, ๊ธฐ์กด ๊ตฌํ˜„์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ž‘์—… ์ค‘์ธ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์‹ค์ œ ๊ตฌํ˜„์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ธฐ๋Œ€์™€ ์ผ์น˜ํ•จ์„ ํ™•์ธํ•˜๊ณ , TensorFlow ์ธก๋ฉด์—์„œ์˜ ๊ธฐ์ˆ ์  ๋ฌธ์ œ๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ง‰๋Œ€ํ•œ ์–‘์˜ ์ •๋ณด๋ฅผ ์ฒ˜์Œ์œผ๋กœ ํ•™์Šตํ•  ๋•Œ ์••๋„๋‹นํ•˜๋Š” ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ๋ชจ๋ธ์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ํ•„์š”๋Š” ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” Hugging Face์˜ [ํฌ๋Ÿผ](https://discuss.huggingface.co/)์„ ํ†ตํ•ด ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€๋‹ต์„ ๊ตฌํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

### 4. ๋ชจ๋ธ ๊ตฌํ˜„ [[4-model-implementation]]


์ด์ œ ๋“œ๋””์–ด ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ œ์•ˆ๋œ ์‹œ์ž‘์ ์€ PyTorch ํŒŒ์ผ ์ž์ฒด์ž…๋‹ˆ๋‹ค: `modeling_brand_new_bert.py`์˜ ๋‚ด์šฉ์„ 
`src/transformers/models/brand_new_bert/` ๋‚ด๋ถ€์˜
`modeling_tf_brand_new_bert.py`์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ๋ชฉํ‘œ๋Š” ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๐Ÿค— Transformers์˜ import ๊ตฌ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ `TFBrandNewBert` ๋ฐ `TFBrandNewBert.from_pretrained(model_repo, from_pt=True)`๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” TensorFlow *BrandNewBert* ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„, PyTorch ๋ชจ๋ธ์„ TensorFlow๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€๋Šฅํ•œํ•œ ์›ํ™œํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํŒ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๋ชจ๋“  ํด๋ž˜์Šค ์ด๋ฆ„ ์•ž์— `TF`๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค(์˜ˆ: `BrandNewBert`๋Š” `TFBrandNewBert`๊ฐ€ ๋ฉ๋‹ˆ๋‹ค).
- ๋Œ€๋ถ€๋ถ„์˜ PyTorch ์ž‘์—…์—๋Š” ์ง์ ‘์ ์ธ TensorFlow ๋Œ€์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `torch.nn.Linear`๋Š” `tf.keras.layers.Dense`์— ํ•ด๋‹นํ•˜๊ณ , `torch.nn.Dropout`์€ `tf.keras.layers.Dropout`์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ž‘์—…์— ๋Œ€ํ•ด ํ™•์‹ ์ด ์—†๋Š” ๊ฒฝ์šฐ [TensorFlow ๋ฌธ์„œ](https://www.tensorflow.org/api_docs/python/tf)๋‚˜ [PyTorch ๋ฌธ์„œ](https://pytorch.org/docs/stable/)๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ๐Ÿค— Transformers ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํŒจํ„ด์„ ์ฐพ์œผ์„ธ์š”. ์ง์ ‘์ ์ธ ๋Œ€์ฒด๊ฐ€ ์—†๋Š” ํŠน์ • ์ž‘์—…์„ ๋งŒ๋‚˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๋ฏธ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
- ๊ธฐ๋ณธ์ ์œผ๋กœ PyTorch์™€ ๋™์ผํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋””๋ฒ„๊น…๊ณผ ๋ฌธ์ œ ์ถ”์ , ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ ์ถ”๊ฐ€๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
- ์ผ๋ถ€ ๋ ˆ์ด์–ด๋Š” ๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ๋ฐฐ์น˜ ์ •๊ทœํ™” ๋ ˆ์ด์–ด์˜ epsilon์€ [PyTorch](https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm2d.html#torch.nn.BatchNorm2d)์—์„œ `1e-5`์ด๊ณ  [TensorFlow](https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization)์—์„œ `1e-3`์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜์„ธ์š”!
- PyTorch์˜ `nn.Parameter` ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ TF ๋ ˆ์ด์–ด์˜ `build()` ๋‚ด์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”: [PyTorch](https://github.com/huggingface/transformers/blob/655f72a6896c0533b1bdee519ed65a059c2425ac/src/transformers/models/vit_mae/modeling_vit_mae.py#L212) /
   [TensorFlow](https://github.com/huggingface/transformers/blob/655f72a6896c0533b1bdee519ed65a059c2425ac/src/transformers/models/vit_mae/modeling_tf_vit_mae.py#L220)
- PyTorch ๋ชจ๋ธ์˜ ํ•จ์ˆ˜ ์ƒ๋‹จ์— `#copied from ...`๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, TensorFlow ๋ชจ๋ธ์— TensorFlow ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์žˆ๋‹ค๋ฉด TensorFlow ๋ชจ๋ธ์ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ณต์‚ฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- TensorFlow ํ•จ์ˆ˜์—์„œ `name` ์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ `from_pt=True` ๊ฐ€์ค‘์น˜ ๊ต์ฐจ ๋กœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. `name`์€ ๋Œ€๋ถ€๋ถ„ PyTorch ์ฝ”๋“œ์˜ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. `name`์ด ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•  ๋•Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ๊ธฐ๋ณธ ๋ชจ๋ธ ํด๋ž˜์Šค์ธ `BrandNewBertModel`์˜ ๋กœ์ง์€ ์‹ค์ œ๋กœ Keras ๋ ˆ์ด์–ด ์„œ๋ธŒํด๋ž˜์Šค([์˜ˆ์‹œ](https://github.com/huggingface/transformers/blob/4fd32a1f499e45f009c2c0dea4d81c321cba7e02/src/transformers/models/bert/modeling_tf_bert.py#L719))์ธ `TFBrandNewBertMainLayer`์— ์žˆ์Šต๋‹ˆ๋‹ค. `TFBrandNewBertModel`์€ ์ด ๋ ˆ์ด์–ด๋ฅผ ๊ฐ์‹ธ๊ธฐ๋งŒ ํ•˜๋Š” ๋ž˜ํผ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
- Keras ๋ชจ๋ธ์€ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `TFBrandNewBertPreTrainedModel`์€ ๋ชจ๋ธ์˜ ์ž…๋ ฅ ์˜ˆ์ œ์ธ `dummy_inputs`([์˜ˆ์‹œ](https://github.com/huggingface/transformers/blob/4fd32a1f499e45f009c2c0dea4d81c321cba7e02/src/transformers/models/bert/modeling_tf_bert.py#L916)) ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋„์›€์„ ์š”์ฒญํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ ์žˆ์–ด์„œ ๋„์›€์„ ๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๐Ÿค—

๋ชจ๋ธ ํŒŒ์ผ ์ž์ฒด ์™ธ์—๋„ ๋ชจ๋ธ ํด๋ž˜์Šค ๋ฐ ๊ด€๋ จ ๋ฌธ์„œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ PR([์˜ˆ์‹œ](https://github.com/huggingface/transformers/pull/18020/files))์˜ ํŒจํ„ด์„ ๋”ฐ๋ผ ์™„์ „ํžˆ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ•„์š”ํ•œ ์ˆ˜๋™ ๋ณ€๊ฒฝ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

- `src/transformers/__init__.py`์— *BrandNewBert*์˜ ๋ชจ๋“  ๊ณต๊ฐœ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
- `src/transformers/models/auto/modeling_tf_auto.py`์—์„œ *BrandNewBert* ํด๋ž˜์Šค๋ฅผ ํ•ด๋‹น Auto ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
- `utils/documentation_tests.txt`์— ๋ชจ๋ธ ํŒŒ์ผ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
- `src/transformers/utils/dummy_tf_objects.py`์— *BrandNewBert*์™€ ๊ด€๋ จ๋œ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
- `src/transformers/models/brand_new_bert/__init__.py`์—์„œ ๊ณต๊ฐœ ํด๋ž˜์Šค์— ๋Œ€ํ•œ import ๊ตฌ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
- `docs/source/en/model_doc/brand_new_bert.md`์—์„œ *BrandNewBert*์˜ ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋ฌธ์„œ ํฌ์ธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
- `docs/source/en/model_doc/brand_new_bert.md`์˜ *BrandNewBert* ๊ธฐ์—ฌ์ž ๋ชฉ๋ก์— ์ž์‹ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
- ๋งˆ์ง€๋ง‰์œผ๋กœ โœ… ๋…น์ƒ‰ ์ฒดํฌ๋ฐ•์Šค๋ฅผ TensorFlow ์—ด docs/source/en/index.md ์•ˆ BrandNewBert์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„์ด ๋งŒ์กฑํ•˜๋ฉด ๋‹ค์Œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.  

1. ํ›ˆ๋ จ ์‹œ๊ฐ„์— ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” `training` ์ธ์ˆ˜๋กœ ๋ถˆ๋ฆฌ๋Š” ๋ชจ๋“  ๋ ˆ์ด์–ด(์˜ˆ: Dropout)๋Š” ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.
2. #copied from ...๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
3. `TFBrandNewBertMainLayer`์™€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋Š” `call`ํ•จ์ˆ˜๋กœ `@unpack_inputs`์™€ ํ•จ๊ป˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฉ๋‹ˆ๋‹ค.
4. `TFBrandNewBertMainLayer`๋Š” `@keras_serializable`๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฉ๋‹ˆ๋‹ค.
5. TensorFlow ๋ชจ๋ธ์€ `TFBrandNewBert.from_pretrained(model_repo, from_pt=True)`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PyTorch ๊ฐ€์ค‘์น˜์—์„œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
6. ์˜ˆ์ƒ ์ž…๋ ฅ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ TensorFlow ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### 5. ๋ชจ๋ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ [[5-add-model-tests]]

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค! ์ด์ œ TensorFlow ๋ชจ๋ธ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ตฌํ˜„์„ ์ž‘์„ฑํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์šฐ๋ฆฌ๋Š” `test_modeling_brand_new_bert.py` ํŒŒ์ผ์„ `tests/models/brand_new_bert/ into test_modeling_tf_brand_new_bert.py`์— ๋ณต์‚ฌํ•œ ๋’ค, TensorFlow๋กœ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€, ๋ชจ๋“  `.from_pretrained()`์„ `from_pt=True`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กด์žฌํ•˜๋Š” Pytorch ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.  

์™„๋ฃŒํ•˜์…จ์œผ๋ฉด, ์ด์ œ ์ง„์‹ค์˜ ์ˆœ๊ฐ„์ด ์ฐพ์•„์™”์Šต๋‹ˆ๋‹ค: ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์„ธ์š”! ๐Ÿ˜ฌ

```bash
NVIDIA_TF32_OVERRIDE=0 RUN_SLOW=1 RUN_PT_TF_CROSS_TESTS=1 \
py.test -vv tests/models/brand_new_bert/test_modeling_tf_brand_new_bert.py
```

์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค! ๊ธฐ๊ณ„ ํ•™์Šต ๋ชจ๋ธ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ์•…๋ช…๋†’๊ฒŒ ์–ด๋ ค์šฐ๋ฉฐ ์„ฑ๊ณต์˜ ํ•ต์‹ฌ ์š”์†Œ๋Š” ์ธ๋‚ด์‹ฌ์ž…๋‹ˆ๋‹ค (`breakpoint()`๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค). ์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์ƒ์œผ๋กœ๋Š” ML ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์ด์˜ ๋ฏธ๋ฌ˜ํ•œ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์ด ์ด ๊ฐ€์ด๋“œ์˜ ๋ ๋ถ€๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์ง์ ‘ ๋ชจ๋ธ์— ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋ชจ๋ธ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ์žฌ์ •์˜๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ด๋“ ์ง€ ์ƒ๊ด€์—†์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹น์‹ ์ด ๊ณ ๋ฆฝ๋˜์—ˆ๋‹ค๋ฉด draft pull request์—์„œ ๋„์›€์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋˜๋ฉด ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋ธ์„ ๐Ÿค— Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€ํ•  ์ค€๋น„๊ฐ€ ๊ฑฐ์˜ ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๐ŸŽ‰


ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๐Ÿค— Transformers์˜ ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ](https://huggingface.co/transformers/contributing.html#running-tests)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

### 6.-7. ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋‹น์‹ ์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ [[6.-7.-ensure-everyone -can-use-your-model]]

**6. ํ’€ ์š”์ฒญ ์ œ์ถœํ•˜๊ธฐ**

๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ’€ ์š”์ฒญ์„ ์ œ์ถœํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ ์„œ์‹ ๋งž์ถ”๊ธฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ธ `make fixup` ๐Ÿช„ ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„œ์‹ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉฐ ์ž๋™ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋“œ๋ž˜ํ”„ํŠธ ํ’€ ์š”์ฒญ์„ ์‹ค์ œ ํ’€ ์š”์ฒญ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. "๋ฆฌ๋ทฐ ์ค€๋น„๋จ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  Joao (`@gante`)์™€ Matt (`@Rocketknight1`)๋ฅผ ๋ฆฌ๋ทฐ์–ด๋กœ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๋ชจ๋ธ ํ’€ ์š”์ฒญ์—๋Š” ์ ์–ด๋„ 3๋ช…์˜ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ๊ทธ๋“ค์ด ๋‹น์‹ ์˜ ๋ชจ๋ธ์— ์ ์ ˆํ•œ ์ถ”๊ฐ€ ๋ฆฌ๋ทฐ์–ด๋ฅผ ์ฐพ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฆฌ๋ทฐ์–ด๋“ค์ด PR ์ƒํƒœ์— ๋งŒ์กฑํ•˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ `.from_pretrained()` ํ˜ธ์ถœ์—์„œ `from_pt=True` ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TensorFlow ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ์„น์…˜์˜ ์ง€์นจ์„ ํ™•์ธํ•˜์„ธ์š”.

๋งˆ์นจ๋‚ด TensorFlow ๊ฐ€์ค‘์น˜๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ณ , ์ ์–ด๋„ 3๋ช…์˜ ๋ฆฌ๋ทฐ์–ด ์Šน์ธ์„ ๋ฐ›์•˜์œผ๋ฉฐ ๋ชจ๋“  CI ๊ฒ€์‚ฌ๊ฐ€ ํ†ต๊ณผ๋˜์—ˆ๋‹ค๋ฉด, ๋กœ์ปฌ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•˜์„ธ์š”.

```bash
NVIDIA_TF32_OVERRIDE=0 RUN_SLOW=1 RUN_PT_TF_CROSS_TESTS=1 \
py.test -vv tests/models/brand_new_bert/test_modeling_tf_brand_new_bert.py
```

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์˜ PR์„ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋งˆ์ผ์Šคํ†ค ๋‹ฌ์„ฑ์„ ์ถ•ํ•˜๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐ŸŽ‰

**7. (์„ ํƒ ์‚ฌํ•ญ) ๋ฐ๋ชจ๋ฅผ ๋งŒ๋“ค๊ณ  ์„ธ์ƒ๊ณผ ๊ณต์œ ํ•˜๊ธฐ**

์˜คํ”ˆ ์†Œ์Šค์˜ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐœ๊ฒฌ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ๋‹น์‹ ์˜ ๋ฉ‹์ง„ TensorFlow ๊ธฐ์—ฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋ฌผ๋ก  ์ ์ ˆํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ“ฃ

์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋ชจ๋ธ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:
- ๋ฐ๋ชจ ๋งŒ๋“ค๊ธฐ. Gradio ๋ฐ๋ชจ, ๋…ธํŠธ๋ถ ๋ฐ ๋ชจ๋ธ์„ ์ž๋ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ์žฌ๋ฏธ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. [์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ฐ˜ ๋ฐ๋ชจ](https://huggingface.co/docs/transformers/community)์— ๋…ธํŠธ๋ถ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
- Twitter์™€ LinkedIn๊ณผ ๊ฐ™์€ ์†Œ์…œ ๋ฏธ๋””์–ด์— ์ด์•ผ๊ธฐ ๊ณต์œ ํ•˜๊ธฐ. ๋‹น์‹ ์˜ ์ž‘์—…์— ์ž๋ž‘์Šค๋Ÿฌ์›Œํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋‹น์‹ ์˜ ์—…์ ์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹น์‹ ์˜ ๋ชจ๋ธ์€ ์ „ ์„ธ๊ณ„์˜ ์ˆ˜์ฒœ ๋ช…์˜ ์—”์ง€๋‹ˆ์–ด์™€ ์—ฐ๊ตฌ์›๋“ค์— ์˜ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐ŸŒ! ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฆฌํŠธ์œ—ํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ ๋‹น์‹ ์˜ ์ž‘์—…์„ ๊ณต์œ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


## ๐Ÿค— ํ—ˆ๋ธŒ์— TensorFlow ๊ฐ€์ค‘์น˜ ์ถ”๊ฐ€ํ•˜๊ธฐ [[adding-tensorFlow-weights-to-๐Ÿค—-hub]]

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๐Ÿค— Transformers์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , PyTorch ๊ฐ€์ค‘์น˜๋ฅผ TensorFlow ๊ฐ€์ค‘์น˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค!

๋‹ค์Œ์€ ๊ทธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค:
1. ํ„ฐ๋ฏธ๋„์—์„œ Hugging Face ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. `huggingface-cli login` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์•ก์„ธ์Šค ํ† ํฐ์€ [์—ฌ๊ธฐ](https://huggingface.co/settings/tokens)์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
2. `transformers-cli pt-to-tf --model-name foo/bar`๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ `foo/bar`๋Š” ๋ณ€ํ™˜ํ•˜๋ ค๋Š” PyTorch ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๋ชจ๋ธ ์ €์žฅ์†Œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
3. ๋ฐฉ๊ธˆ ๋งŒ๋“  ๐Ÿค— ํ—ˆ๋ธŒ PR์—์„œ `@joaogante`์™€ `@Rocketknight1`์„ ํƒœ๊ทธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋‹ค์ž…๋‹ˆ๋‹ค! ๐ŸŽ‰


## ML ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„ ๋””๋ฒ„๊น… ๐Ÿ›[[debugging-mismatches-across-ml-frameworks]]

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ TensorFlow ๊ฐ€์ค‘์น˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, PyTorch์™€ TensorFlow ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•ด ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ์š”? ๐Ÿค”

๋จผ์ €, ์ด๋Ÿฌํ•œ ๋ถˆ์ผ์น˜๋ฅผ ์ดํ•ดํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฉค๋ฒ„๋“ค์€ ๐Ÿค— Transformers ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์šฐ๋ฆฌ์˜ ๋ชจ๋ธ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์— ํฐ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋ธ์ด ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ตฌํ˜„์„ ๋”ฐ๋ฅด์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋ธ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Š” ์•„์˜ˆ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ชจ๋ธ๋ณด๋‹ค ๋‚˜์  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋ชจ๋ธ์˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋ถˆ์ผ์น˜๋ฅผ `1e-5`๋ณด๋‹ค ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์ˆซ์ž ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์„ธ์„ธํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ธ์„ธํ•จ์— ์ง‘์ค‘ํ•˜๋Š” ๊ณต์ •์—์„œ ํ•„์ˆ˜ ์š”์†Œ๋Š” ์ธ๋‚ด์‹ฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๊ถŒ์žฅ๋˜๋Š” ์ž‘์—… ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
1. ๋ถˆ์ผ์น˜์˜ ์›์ธ์„ ์ฐพ์•„๋ณด์‹ญ์‹œ์˜ค. ๋ณ€ํ™˜ ์ค‘์ธ ๋ชจ๋ธ์€ ์•„๋งˆ๋„ ํŠน์ • ์ง€์ ๊นŒ์ง€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์•„ํ‚คํ…์ฒ˜์— `breakpoint()` ๋ฌธ์„ ๋„ฃ๊ณ , ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆซ์ž ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ์›์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
2. ์ด์ œ ๋ฌธ์ œ์˜ ๊ทผ์›์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ๐Ÿค— Transformers ํŒ€์— ์—ฐ๋ฝํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ์ด์ „์— ๊ฒช์—ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ์—๋Š” StackOverflow์™€ GitHub ์ด์Šˆ์™€ ๊ฐ™์€ ์ธ๊ธฐ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
3. ๋” ์ด์ƒ ํ•ด๊ฒฐ์ฑ…์ด ์—†๋Š” ๊ฒฝ์šฐ, ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์€ ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๋ชจ๋ธ์„ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ช…๋ น์–ด์— ์ดˆ์ ์„ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋‚˜์œ ์†Œ์‹์€ ํ•ด๋‹น ๋ช…๋ น์–ด์˜ ์†Œ์Šค ๊ตฌํ˜„์— ๋Œ€ํ•ด ์•Œ์•„๋ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ์ฐธ์กฐ ๊ตฌํ˜„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์—…์ŠคํŠธ๋ฆผ ์ €์žฅ์†Œ์—์„œ ์ด์Šˆ๋ฅผ ์—ด๊ธฐ๋ฅผ ๊บผ๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๐Ÿค— Transformers ํŒ€๊ณผ์˜ ํ† ๋ก ์„ ํ†ตํ•ด ๋ถˆ์ผ์น˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ์ถœ๋ ฅ ๋ ˆ์ด์–ด์—์„œ ๋ถˆ์ผ์น˜๊ฐ€ ๋งค์šฐ ์ž‘์ง€๋งŒ ์ˆจ๊ฒจ์ง„ ์ƒํƒœ์—์„œ ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ชจ๋ธ์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ์šฐ์„ ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ์ผ์น˜๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ `pt-to-tf` CLI์—๋Š” ๊ฐ€์ค‘์น˜ ๋ณ€ํ™˜ ์‹œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌด์‹œํ•˜๋Š” `--max-error` ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.