11.1. Поддержка API массивов (экспериментальная)

Спецификация Array API <https://data-apis.org/array-api/latest/>`_ определяет стандартный API для всех библиотек манипуляции массивами с API, подобным NumPy. Для поддержки API Array в Scikit-learn требуется установка array-api-compat.

Некоторые модели scikit-learn, которые в основном полагаются на NumPy (в отличие от использования Cython) для реализации алгоритмической логики своих методов fit, predict или transform, могут быть настроены на прием любых входных структур данных, совместимых с Array API, и автоматически отправлять операции в базовое пространство имен вместо того, чтобы полагаться на NumPy.

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

Примечание

В настоящее время известно, что только cupy.array_api, numpy.array_api, cupy и PyTorch работают с моделями scikit-learn.

11.1.1. Пример использования

Вот пример фрагмента кода, демонстрирующий, как использовать CuPy для запуска LinearDiscriminantAnalysis на GPU:

>>> from sklearn.datasets import make_classification
>>> from sklearn import config_context
>>> from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
>>> import cupy

>>> X_np, y_np = make_classification(random_state=0)
>>> X_cu = cupy.asarray(X_np)
>>> y_cu = cupy.asarray(y_np)
>>> X_cu.device
<CUDA Device 0>

>>> with config_context(array_api_dispatch=True):
...     lda = LinearDiscriminantAnalysis()
...     X_trans = lda.fit_transform(X_cu, y_cu)
>>> X_trans.device
<CUDA Device 0>

После обучения модели подобранные атрибуты, являющиеся массивами, также будут принадлежать тому же пространству имен Array API, что и обучающие данные. Например, если для обучения использовалось пространство имен Array API CuPy, то подобранные атрибуты будут находиться на графическом процессоре. Мы предоставляем экспериментальную утилиту _estimator_with_converted_arrays, которая передает атрибуты модели из Array API в ndarray:

>>> from sklearn.utils._array_api import _estimator_with_converted_arrays
>>> cupy_to_ndarray = lambda array : array.get()
>>> lda_np = _estimator_with_converted_arrays(lda, cupy_to_ndarray)
>>> X_trans = lda_np.transform(X_np)
>>> type(X_trans)
<class 'numpy.ndarray'>

11.1.1.1. Поддержка PyTorch

Тензоры PyTorch поддерживаются путем установки array_api_dispatch=True и прямой передачи тензоров:

>>> import torch
>>> X_torch = torch.asarray(X_np, device="cuda", dtype=torch.float32)
>>> y_torch = torch.asarray(y_np, device="cuda", dtype=torch.float32)
>>> with config_context(array_api_dispatch=True):
...     lda = LinearDiscriminantAnalysis()
...     X_trans = lda.fit_transform(X_torch, y_torch)
>>> type(X_trans)
<class 'torch.Tensor'>
>>> X_trans.device.type
'cuda'

11.1.2. Поддержка входов, совместимых с Array API

Модели и другие инструменты scikit-learn, поддерживающие входные данные, совместимые с Array API.

11.1.2.1. Модели

11.1.2.2. Метрики

11.1.2.3. Tools

Ожидается, что со временем охват будет расти. Пожалуйста, следите за специальным мета-выпуском на GitHub, чтобы отслеживать прогресс.

11.1.3. Общие проверки модели

Добавьте тег array_api_support в набор тегов модели, чтобы указать, что он поддерживает Array API. Это позволит проводить специальные проверки в рамках общих тестов, чтобы убедиться, что результаты моделей одинаковы при использовании входных данных NumPy и Array API.

Чтобы запустить эти проверки, вам необходимо установить array_api_compat в вашей тестовой среде. Чтобы выполнить полный набор проверок, вам необходимо установить PyTorch и CuPy и иметь графический процессор. Проверки, которые невозможно выполнить или у которых отсутствуют зависимости, будут автоматически пропущены. Поэтому важно запускать тесты с флагом -v, чтобы увидеть, какие проверки пропущены:

pip install array-api-compat  # and other libraries as needed
pytest -k "array_api" -v

11.1.3.1. Примечание о поддержке устройств MPS

В macOS PyTorch может использовать шейдеры Metal Performance Shaders (MPS) для доступа к аппаратным ускорителям (например, внутреннему компоненту графического процессора чипов M1 или M2). Однако на момент написания поддержка устройств MPS для PyTorch не завершена. Дополнительную информацию см. в следующем выпуске github:

Чтобы включить поддержку MPS в PyTorch, установите переменную среды PYTORCH_ENABLE_MPS_FALLBACK=1 перед запуском тестов:

PYTORCH_ENABLE_MPS_FALLBACK=1 pytest -k "array_api" -v

На момент написания все тесты scikit-learn должны быть пройдены, однако скорость вычислений не обязательно выше, чем у устройства ЦП.