Transformers documentation

์–ด๋–ป๊ฒŒ ๐Ÿค— Transformers ๋ชจ๋ธ์„ TensorFlow๋กœ ๋ณ€ํ™˜ํ•˜๋‚˜์š”?

You are viewing v4.36.1 version. A newer version v4.47.1 is available.
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

์–ด๋–ป๊ฒŒ ๐Ÿค— Transformers ๋ชจ๋ธ์„ TensorFlow๋กœ ๋ณ€ํ™˜ํ•˜๋‚˜์š”?

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

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

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

๋” ๊นŠ์ด ์•Œ์•„๋ณด๊ธฐ ์ „์—, ๐Ÿค— Transformers๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ž๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

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

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

์„ ํƒํ•œ ๋ชจ๋ธ(์˜ˆ)์˜ config.json์˜ model_type ํ•„๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”. ๐Ÿค— Transformers์˜ ํ•ด๋‹น ๋ชจ๋ธ ํด๋”์—๋Š” โ€œmodeling_tfโ€๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ชจ๋ธ์—๋Š” ํ•ด๋‹น TensorFlow ์•„ํ‚คํ…์ฒ˜(์˜ˆ)๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

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

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

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฐœ๋žต์ ์œผ๋กœ ์จ๋ณด๋ฉด:

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

1.-3. ๋ชจ๋ธ ๊ธฐ์—ฌ ์ค€๋น„

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

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

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

TensorFlow ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜์— ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. BrandNewBert๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ pull request GitHub ํŽ˜์ด์ง€์—์„œ TensorFlow ๊ด€๋ จ pull request๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

  1. โ€˜Forkโ€™ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ํฌํฌํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด GitHub ์‚ฌ์šฉ์ž ๊ณ„์ •์— ์ฝ”๋“œ์˜ ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  1. transformers ํฌํฌ๋ฅผ ๋กœ์ปฌ ๋””์Šคํฌ์— ํด๋ก ํ•˜๊ณ  ์›๋ณธ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์›๊ฒฉ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋กœ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
git clone https://github.com/[your Github handle]/transformers.git
cd transformers
git remote add upstream https://github.com/huggingface/transformers.git
  1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
python -m venv .env
source .env/bin/activate
pip install -e ".[dev]"

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

pip install -e ".[quality]"

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

  1. ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ๋งŒ๋“œ๋ ค๋Š” ๊ธฐ๋Šฅ์ด ์ž˜ ํ‘œํ˜„๋˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
git checkout -b add_tf_brand_new_bert
  1. ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํŽ˜์น˜(fetch)ํ•˜๊ณ  ๋ฆฌ๋ฒ ์ด์Šคํ•˜์„ธ์š”.
git fetch upstream
git rebase upstream/main
  1. transformers/src/models/brandnewbert/์— modeling_tf_brandnewbert.py๋ผ๋Š” ๋นˆ .py ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์ด ํŒŒ์ผ์ด TensorFlow ๋ชจ๋ธ ํŒŒ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

git add .
git commit -m "initial commit"
git push -u origin add_tf_brand_new_bert
  1. ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ GitHub์—์„œ ํฌํฌ๋œ ์›น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. โ€œPull requestโ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. Hugging Face ํŒ€์˜ GitHub ID๋ฅผ ๋ฆฌ๋ทฐ์–ด๋กœ ์ถ”๊ฐ€ํ•ด์„œ, ์•ž์œผ๋กœ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด Hugging Face ํŒ€์ด ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  1. GitHub Pull Requests ํŽ˜์ด์ง€์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” โ€œConvert to draftโ€๋ฅผ ํด๋ฆญํ•˜์—ฌ PR์„ ์ดˆ์•ˆ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”.

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

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

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

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

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

4. ๋ชจ๋ธ ๊ตฌํ˜„

์ด์ œ ๋“œ๋””์–ด ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ œ์•ˆ๋œ ์‹œ์ž‘์ ์€ 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 ๋ฌธ์„œ๋‚˜ PyTorch ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๐Ÿค— Transformers ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํŒจํ„ด์„ ์ฐพ์œผ์„ธ์š”. ์ง์ ‘์ ์ธ ๋Œ€์ฒด๊ฐ€ ์—†๋Š” ํŠน์ • ์ž‘์—…์„ ๋งŒ๋‚˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๋ฏธ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ PyTorch์™€ ๋™์ผํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋””๋ฒ„๊น…๊ณผ ๋ฌธ์ œ ์ถ”์ , ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ ์ถ”๊ฐ€๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ ๋ ˆ์ด์–ด๋Š” ๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ๋ฐฐ์น˜ ์ •๊ทœํ™” ๋ ˆ์ด์–ด์˜ epsilon์€ PyTorch์—์„œ 1e-5์ด๊ณ  TensorFlow์—์„œ 1e-3์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜์„ธ์š”!
  • PyTorch์˜ nn.Parameter ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ TF ๋ ˆ์ด์–ด์˜ build() ๋‚ด์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”: PyTorch / TensorFlow
  • PyTorch ๋ชจ๋ธ์˜ ํ•จ์ˆ˜ ์ƒ๋‹จ์— #copied from ...๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, TensorFlow ๋ชจ๋ธ์— TensorFlow ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์žˆ๋‹ค๋ฉด TensorFlow ๋ชจ๋ธ์ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ณต์‚ฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TensorFlow ํ•จ์ˆ˜์—์„œ name ์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ from_pt=True ๊ฐ€์ค‘์น˜ ๊ต์ฐจ ๋กœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. name์€ ๋Œ€๋ถ€๋ถ„ PyTorch ์ฝ”๋“œ์˜ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. name์ด ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•  ๋•Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋ชจ๋ธ ํด๋ž˜์Šค์ธ BrandNewBertModel์˜ ๋กœ์ง์€ ์‹ค์ œ๋กœ Keras ๋ ˆ์ด์–ด ์„œ๋ธŒํด๋ž˜์Šค(์˜ˆ์‹œ)์ธ TFBrandNewBertMainLayer์— ์žˆ์Šต๋‹ˆ๋‹ค. TFBrandNewBertModel์€ ์ด ๋ ˆ์ด์–ด๋ฅผ ๊ฐ์‹ธ๊ธฐ๋งŒ ํ•˜๋Š” ๋ž˜ํผ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Keras ๋ชจ๋ธ์€ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ TFBrandNewBertPreTrainedModel์€ ๋ชจ๋ธ์˜ ์ž…๋ ฅ ์˜ˆ์ œ์ธ dummy_inputs(์˜ˆ์‹œ) ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋„์›€์„ ์š”์ฒญํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ ์žˆ์–ด์„œ ๋„์›€์„ ๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๐Ÿค—

๋ชจ๋ธ ํŒŒ์ผ ์ž์ฒด ์™ธ์—๋„ ๋ชจ๋ธ ํด๋ž˜์Šค ๋ฐ ๊ด€๋ จ ๋ฌธ์„œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ PR(์˜ˆ์‹œ)์˜ ํŒจํ„ด์„ ๋”ฐ๋ผ ์™„์ „ํžˆ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ•„์š”ํ•œ ์ˆ˜๋™ ๋ณ€๊ฒฝ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  • src/transformers/__init__.py์— BrandNewBert์˜ ๋ชจ๋“  ๊ณต๊ฐœ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • src/transformers/models/auto/modeling_tf_auto.py์—์„œ BrandNewBert ํด๋ž˜์Šค๋ฅผ ํ•ด๋‹น Auto ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • 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. ๋ชจ๋ธ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

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 ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

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์˜ ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

6.-7. ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋‹น์‹ ์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ

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

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

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

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

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

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 ๋ฐ๋ชจ, ๋…ธํŠธ๋ถ ๋ฐ ๋ชจ๋ธ์„ ์ž๋ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ์žฌ๋ฏธ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ฐ˜ ๋ฐ๋ชจ์— ๋…ธํŠธ๋ถ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Twitter์™€ LinkedIn๊ณผ ๊ฐ™์€ ์†Œ์…œ ๋ฏธ๋””์–ด์— ์ด์•ผ๊ธฐ ๊ณต์œ ํ•˜๊ธฐ. ๋‹น์‹ ์˜ ์ž‘์—…์— ์ž๋ž‘์Šค๋Ÿฌ์›Œํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋‹น์‹ ์˜ ์—…์ ์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹น์‹ ์˜ ๋ชจ๋ธ์€ ์ „ ์„ธ๊ณ„์˜ ์ˆ˜์ฒœ ๋ช…์˜ ์—”์ง€๋‹ˆ์–ด์™€ ์—ฐ๊ตฌ์›๋“ค์— ์˜ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐ŸŒ! ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฆฌํŠธ์œ—ํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ ๋‹น์‹ ์˜ ์ž‘์—…์„ ๊ณต์œ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿค— ํ—ˆ๋ธŒ์— TensorFlow ๊ฐ€์ค‘์น˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

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

๋‹ค์Œ์€ ๊ทธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค:

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

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

ML ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„ ๋””๋ฒ„๊น… ๐Ÿ›

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

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

๊ธฐํƒ€ ์ˆซ์ž ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์„ธ์„ธํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ธ์„ธํ•จ์— ์ง‘์ค‘ํ•˜๋Š” ๊ณต์ •์—์„œ ํ•„์ˆ˜ ์š”์†Œ๋Š” ์ธ๋‚ด์‹ฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๊ถŒ์žฅ๋˜๋Š” ์ž‘์—… ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

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

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