# 유틸리티 가져오기

이 페이지는 지연 및 빠른 객체 가져오기를 가능하게 하는 `transformers` 유틸리티를 다룹니다. 최소한의 의존성을 지향하지만, 일부 모델은 우회할 수 없는 특정 의존성 요구사항이 있습니다. `transformers`의 모든 사용자가 다른 모델을 사용하려면 해당 의존성을 설치해야 하는 것을 원하지 않으므로, 이를 하드 의존성이 아닌 소프트 의존성으로 표시합니다.

Transformers 툴킷은 특정 의존성이 있는 모델을 가져올 때 오류를 발생시키도록 설계되지 않았습니다. 대신, 필요한 의존성이 없는 객체는 해당 객체의 메서드를 호출할 때 오류가 발생합니다. 예를 들어, `torchvision`이 설치되어 있지 않으면 빠른 이미지 프로세서가 사용할 수 없습니다.

이 객체는 여전히 가져올 수 있습니다:

```python
>>> from transformers import DetrImageProcessor
>>> print(DetrImageProcessor)
<class 'transformers.models.detr.image_processing_detr.DetrImageProcessor'>
```

그러나 해당 객체의 메서드는 호출 시 선택적 의존성을 확인합니다. 예를 들어, `torchvision`이 사용 불가능한 경우 이 호출은 `ImportError`를 발생시킵니다:

```python
>>> DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
ImportError:
DetrImageProcessor requires the Torchvision library but it was not found in your environment. Check out the instructions on the
installation page: https://pytorch.org/get-started/locally/ and follow the ones that match your environment.
Please note that you may need to restart your runtime after installation.
```

object 의존성을 구체적으로 지정하는 방법을 살펴보겠습니다.

## 객체 의존성 지정

### 파일명 기반

filename 아래에 있는 모든 객체는 해당 filename에 연결된 도구에 대한 자동 종속성을 가집니다.

**PyTorch**: `modeling_`로 시작하는 모든 파일에는 PyTorch에 대한 자동 종속성이 있습니다

**Tokenizers**: `tokenization_`로 시작하고 `_fast`로 끝나는 모든 파일에는 `tokenizers`에 대한 자동 종속성이 있습니다

**Vision**: `image_processing_`로 시작하는 모든 파일은 `vision` 의존성 그룹에 대한 자동 의존성이 있습니다. 작성 시점에는 이 그룹에 `pillow` 의존성만 포함되어 있습니다.

**Vision + Torch + Torchvision**: `image_processing_`로 시작하고 `_fast`로 끝나는 모든 파일에는 `vision`, `torch`, `torchvision`에 대한 자동 종속성이 있습니다.

이러한 모든 자동 의존성은 아래에 자세히 설명된 명시적 의존성에 추가됩니다.

### 명시적 객체 의존성

`requires`라는 메서드를 추가하여 특정 객체의 종속성을 명시적으로 지정합니다. 예를 들어, `Trainer` 클래스에는 `torch`와 `accelerate`라는 두 가지 필수 종속성이 있습니다. 이러한 필수 종속성을 지정하는 방법은 다음과 같습니다:

```python
from .utils.import_utils import requires

@requires(backends=("torch", "accelerate"))
class Trainer:
    ...
```

여기에 추가할 수 있는 백엔드는 `import_utils.py` 모듈에서 사용 가능한 모든 백엔드입니다.

추가로, 각 백엔드에서 특정 버전을 지정할 수 있습니다. 예를 들어, `Trainer` 클래스에서 torch>=2.6 요구 사항을 지정하는 방법은 다음과 같습니다:

```python
from .utils.import_utils import requires

@requires(backends=("torch>=2.6", "accelerate"))
class Trainer:
    ...
```

다음 연산자를 지정할 수 있습니다: `==`, `>`, `>=`, `<`, `<=`, `!=`.

## 메서드[[transformers.utils.import_utils.define_import_structure]]

#### transformers.utils.import_utils.define_import_structure[[transformers.utils.import_utils.define_import_structure]]

```python
transformers.utils.import_utils.define_import_structure(module_path: str, prefix: str | None = None)
```

이 메서드는 module_path를 입력으로 받아 _LazyModule이 처리할 수 있는 import 구조를 생성합니다.

src.transformers.models 레벨의 출력 import 구조 예시입니다:

{ frozenset({'tokenizers'}): { 'albert.tokenization_albert_fast': {'AlbertTokenizer'} }, frozenset(): { 'albert.configuration_albert': {'AlbertConfig'}, 'align.processing_align': {'AlignProcessor'}, 'align.configuration_align': {'AlignConfig', 'AlignTextConfig', 'AlignVisionConfig'}, 'altclip.configuration_altclip': {'AltCLIPConfig', 'AltCLIPTextConfig', 'AltCLIPVisionConfig'}, 'altclip.processing_altclip': {'AltCLIPProcessor'} } }

import 구조는 frozenset을 키로 사용하고, 문자열에서 객체 집합으로 매핑되는 dict로 정의됩니다.

`prefix`가 None이 아니면 반환되는 dict의 모든 키에 해당 접두사가 추가됩니다.

#### transformers.utils.import_utils.requires[[transformers.utils.import_utils.requires]]

```python
transformers.utils.import_utils.requires(backends = ())
```

[소스](https://github.com/huggingface/transformers/blob/main/src/transformers/utils/import_utils.py#L3057)

이 데코레이터는 두 가지를 가능하게 합니다:
- `__backends` 튜플을 객체에 연결하여, 해당 객체를 인스턴스화하지 않고도 올바르게 실행하는 데 필요한 백엔드가 무엇인지 확인합니다
- '@requires' 문자열은 객체를 동적으로 가져오기 위해 사용됩니다

#### transformers.requires_backends[[transformers.requires_backends]]

```python
transformers.requires_backends(obj, backends)
```

[소스](https://github.com/huggingface/transformers/blob/main/src/transformers/utils/import_utils.py#L2477)

**매개변수:**

obj : 검사할 대상

backends : 확인할 backends의 list 또는 tuple.

지정한 backends가 사용 불가능한 경우 자동으로 예외를 발생시키는 메서드입니다. 주로 클래스

필요한 종속성이 설치되었는지 확인하기 위한 초기화:

```py
requires_backends(self, ["torch"])
```

백엔드는 `transformers.utils.import_utils`에 정의된 `BACKEND_MAPPING`에 정의되어야 합니다.

