Transformers documentation
Fusion 매핑 (실험적 기능)
Fusion 매핑 (실험적 기능)
Fusion mapping은 원래의 체크포인트 형식을 유지하면서 로드 시점에 모델의 서브모듈을 교체할 수 있는 선택적(opt-in) 방법을 제공합니다.
다음에 기반합니다:
- 모델 인스턴스화 전에 모듈 클래스를 교체하기 위한 Monkey patching.
- 원래 런타임 레이아웃과 병합된 런타임 레이아웃 사이에서 가중치를 매핑하기 위한 동적 가중치 로딩
Fusion mapping은 실험적 로딩 기능입니다. 런타임 모듈 구조를 변경하며 모델 동작에 영향을 줄 수 있습니다. 명시적으로 fused 런타임 레이아웃을 원할 때만 사용하세요.
빠른 시작
fusion_config를 사용하여 from_pretrained()를 통해 Fusion을 활성화합니다:
from transformers import AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
"Qwen/Qwen2-VL-2B-Instruct",
fusion_config={"patch_embeddings": True},
)기본적으로 퓨전은 적용되지 않습니다.
fusion_config가 모델 설정에 저장되어 있으면, from_pretrained()가 이를 자동으로 재사용합니다.
작동 방식
Fusion 등록은 모델이 인스턴스화되기 전에 수행됩니다:
- from_pretrained()는 명시적인
fusion_config인수를 사용하거나config.fusion_config로 폴백합니다. - fusion registry는 요청된 fusion 이름을 검증합니다.
- 각 활성화된 fusion은 대상 모델 클래스를 메타 초기화하고, 필요에 따라 모듈 이름을 기준으로 후보 모듈을 필터링하며,
is_fusable(...)를 사용하여 호환되는 모듈 클래스를 탐색합니다. - Fused replacement classes는 register_patch_mapping()을 통해 등록됩니다.
- config에서
~WeightTransform규칙을 생성하여 체크포인트 로드 시 가중치를 융합된 런타임 레이아웃으로 매핑할 수 있습니다. - 기본적으로 save_pretrained()는 원래의 체크포인트 레이아웃을 복원하기 위해 역방향 변환 경로를 사용합니다. 변환된 런타임 레이아웃을 유지하려면
save_original_format=False를 전달하세요.
이를 통해 fusion은 원래의 checkpoint 형식에서 로드하고 기본적으로 다시 저장하는 것을 유지하면서 다른 런타임 모듈 구조를 사용할 수 있습니다.
Note: 현재 monkey-patching 메커니즘에서는 fusion 등록이 클래스 수준입니다: 하나의 호환 가능한 모듈 클래스가 하나의 fused 대체 클래스에 매핑됩니다.
현재의 fusion 계열
현재 fusion_config는 하나의 fusion family를 지원합니다:
patch_embeddings활성화 방법:fusion_config = {"patch_embeddings": True}Effect: 호환되는
nn.Conv3d패치 임베딩 투영을 런타임에 동등한 평탄화된nn.Linear투영으로 대체합니다.
퓨전 매핑 확장
새로운 fusion family를 추가하려면:
is_fusable판정 조건을 추가합니다. 이 판정 조건은 발견된 모듈이 퓨전과 호환되는지 여부를 결정합니다.target_modules_patterns를 선택적으로 추가할 수 있습니다. 이렇게 하면is_fusable(...)호출 전에 후보 모듈 이름을 사전 필터링하여 탐색 단계를 더 명시적으로 만듭니다.make_fused_class팩토리를 추가합니다. 호환되는 모듈 클래스에 대한 런타임 대체 클래스를 반환합니다.- fused layout에 checkpoint 변환이 필요한 경우
make_transforms팩토리를 추가합니다. 이 팩토리는 주어진 config에 대해 원래 layout과 fused layout 사이에서 가중치를 매핑하는~WeightTransform규칙을 반환합니다. ModuleFusionSpec을fusion_mapping.py에 등록합니다.
등록이 완료되면, 새로운 fusion은 fusion_config를 통해 사용할 수 있게 됩니다.
내부 API
퓨전 계열의 기본 레시피.
fusion spec은 어떤 모듈이 fusion 대상이 되는지, 런타임 대체 클래스를 어떻게 구성할지, 그리고 원래 레이아웃과 fusion된 레이아웃 간에 체크포인트를 매핑하는 데 필요한 가중치 변환이 무엇인지를 결정합니다.
호환되는 모듈을 찾지 못할 때 출력되는 로그 메시지를 반환합니다.
module이 이 fusion family와 호환되는지 여부를 반환합니다.
호환되는 모듈 클래스에 대한 런타임 대체 클래스를 빌드합니다.
…
호환되는 Conv3d 패치 임베딩을 평탄화된 Linear 투영으로 병합합니다.
transformers.fusion_mapping._register_module_fusion
< source >( config: PretrainedConfigfusion_name: strspec: ModuleFusionSpec )
cls에 하나의 fusion family를 등록합니다.
이 함수는 융합 로딩에 사용되는 두 개의 전역 레지스트리를 업데이트합니다:
- monkey-patching 레지스트리이므로, 호환되는 모듈 클래스가 초기화 전에 교체됩니다
- checkpoint 변환 매핑이므로, 융합된 런타임 모듈은 여전히 원래 checkpoint 레이아웃에서 로드됩니다
참고:
- conflicting checkpoint transforms fail fast
transformers.fusion_mapping.register_fusion_patches
< source >( configfusion_config: collections.abc.Mapping[str, bool | collections.abc.Mapping[str, typing.Any]] | None = None )
cls에 대해 요청된 런타임 퓨전을 등록합니다.
이 함수는:
fusion_config를_FUSION_REGISTRY와 비교하여 검증합니다- resolves the enabled fusion families in user order
- 모델 인스턴스화 전에 monkey patch와 checkpoint 변환을 등록합니다