# Импорт утилит

На этой странице описаны утилиты 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.
```

Рассмотрим, как указать зависимости от конкретных объектов.

## Зависимости объектов

### На основе имени файла

Все объекты с заданным именем файла имеют автоматическую зависимость от инструмента, связанного с этим именем файла

**PyTorch**: все файлы, начинающиеся с `modeling_`, имеют автоматическую зависимость от PyTorch

**Токенизаторы**: все файлы, начинающиеся с `tokenization_` и заканчивающиеся на `_fast`, имеют автоматическую зависимость от `tokenizers`

**Зрение**: все файлы, начинающиеся с `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`.

Кроме того, в каждом бэкенде можно указать конкретные версии. Например, так вы зададите требование torch>=2.6 для класса `Trainer`:

```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.

Вот пример структуры импорта на уровне src.transformers.models:

{ 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'} } }

Структура импорта представляет собой словарь, в котором ключами являются frozensets, а значениями — словари, сопоставляющие строки с множествами объектов.

Если `prefix` не равен None, этот префикс будет добавлен ко всем ключам в возвращаемом словаре.

#### 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#L3027)

Этот декоратор позволяет сделать две вещи:
- Привязка кортежа `__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#L2447)

**Параметры:**

obj : объект, подлежащий проверке

backends : список или кортеж бэкендов для проверки.

Метод, который автоматически вызывает исключение, если указанные бэкенды недоступны. Часто используется во время класса

инициализации для установки необходимых зависимостей:

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

Бэкенды должны быть определены в `BACKEND_MAPPING`, который находится в `transformers.utils.import_utils`.

