ahassoun's picture
Upload 3018 files
ee6e328

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

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

  • 일반적인 ν…ŒμŠ€νŠΈ
  • λ¬Έμ„œ λΉŒλ“œ
  • μ½”λ“œ 및 λ¬Έμ„œ μŠ€νƒ€μΌ
  • 일반 μ €μž₯μ†Œ 일관성

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

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

pip install transformers[dev]

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

pip install -e .[dev]

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

pip install transformers[quality]

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

pip install -e .[quality]

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

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

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

python utils/tests_fetcher.py

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

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

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

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λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

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

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

make style

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

make quality

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

make fixup

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

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

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

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μ—μ„œ μˆ˜ν–‰)

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

make fix-copies

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

  • μΆ”κ°€λœ λͺ¨λ“  λͺ¨λΈμ΄ Auto-mapping에 μžˆλŠ”μ§€ (utils/check_repo.pyμ—μ„œ μˆ˜ν–‰)
  • λͺ¨λ“  λͺ¨λΈμ΄ μ˜¬λ°”λ₯΄κ²Œ ν…ŒμŠ€νŠΈλ˜μ—ˆλŠ”μ§€ (utils/check_repo.pyμ—μ„œ μˆ˜ν–‰)

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

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

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

이 λ©”μ»€λ‹ˆμ¦˜μ€ # Copied from xxx ν˜•μ‹μ˜ 주석을 기반으둜 ν•©λ‹ˆλ‹€. xxxμ—λŠ” μ•„λž˜μ— λ³΅μ‚¬λ˜λŠ” 클래슀 λ˜λŠ” ν•¨μˆ˜μ˜ 전체 κ²½λ‘œκ°€ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ RobertaSelfOutput은 BertSelfOutput 클래슀의 λ³΅μ‚¬λ³Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ—¬κΈ°μ—μ„œ 주석이 μžˆμŠ΅λ‹ˆλ‹€:

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

클래슀 전체에 μˆ˜μ •μ„ μ μš©ν•˜λŠ” λŒ€μ‹ μ— 볡사본과 κ΄€λ ¨μžˆλŠ” λ©”μ„œλ“œμ— μ μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ—¬κΈ°μ—μ„œ RobertaPreTrainedModel._init_weightsκ°€ BertPreTrainedModel의 λ™μΌν•œ λ©”μ„œλ“œμ—μ„œ λ³΅μ‚¬λœ 것을 λ³Ό 수 있으며 ν•΄λ‹Ή 주석이 μžˆμŠ΅λ‹ˆλ‹€:

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

볡사본이 μ΄λ¦„λ§Œ λ‹€λ₯Έ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€: 예λ₯Ό λ“€μ–΄ RobertaAttentionμ—μ„œ BertSelfAttention λŒ€μ‹  RobertaSelfAttention을 μ‚¬μš©ν•˜μ§€λ§Œ κ·Έ μ™Έμ—λŠ” μ½”λ“œκ°€ μ™„μ „νžˆ λ™μΌν•©λ‹ˆλ‹€: 이 λ•Œ # Copied from은 Copied from xxx with foo->bar와 같은 κ°„λ‹¨ν•œ λ¬Έμžμ—΄ λŒ€μ²΄λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  foo μΈμŠ€ν„΄μŠ€λ₯Ό bar둜 λ°”κΏ”μ„œ μ½”λ“œλ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

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

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

λŒ€μ²΄ νŒ¨ν„΄μ„ μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ—¬λŸ¬ νŒ¨ν„΄μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ CamemberForMaskedLM은 두 가지 λŒ€μ²΄ 사항을 가진 RobertaForMaskedLM의 λ³΅μ‚¬λ³Έμž…λ‹ˆλ‹€: Robertaλ₯Ό Camembert둜 λŒ€μ²΄ν•˜κ³  ROBERTAλ₯Ό CAMEMBERT둜 λŒ€μ²΄ν•©λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ 이것이 μ£Όμ„μœΌλ‘œ μ–΄λ–»κ²Œ κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

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

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

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

νŒ¨ν„΄μ˜ λŒ€μ†Œλ¬Έμžκ°€ λ‹€λ₯Έ 경우(λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμžκ°€ 혼용된 λŒ€μ²΄ 양식) all-casing μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ MobileBertForSequenceClassificationμ—μ„œ μ‚¬μš©λœ μ˜ˆμ‹œλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

# 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 μƒμˆ˜μ—μ„œ)