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. Модели¶
decomposition.PCA
(сsvd_solver="full"
,svd_solver="randomized"
иpower_iteration_normalizer="QR"
)discriminant_analysis.LinearDiscriminantAnalysis
(сsolver="svd"
)
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 должны быть пройдены, однако скорость вычислений не обязательно выше, чем у устройства ЦП.