Почему метод cuml predict() для KNearestNeighbors занимает так много времени с фреймом данных dask_cudf?

#gpu #dask #dask-distributed #rapids #cudf

#gpu #dask #dask-распределенный #пороги #cudf

Вопрос:

У меня большой набор данных (около 80 миллионов строк), и я обучаю модель регрессии KNearestNeighbors с использованием cuml с фреймом данных dask_cudf.

Я использую 4 графических процессора с rmm_pool_size по 15 ГБ каждый:

 from dask.distributed import Client
from dask_cuda import LocalCUDACluster
import cudf, cuml
import dask_cudf

cluster = LocalCUDACluster(
    rmm_pool_size="15GB"
)

client = Client(cluster)
client.run(cudf.set_allocator, "managed")
  

Я считываю данные из файла parquet, хранящегося в корзине S3:

 df = dask_cudf.read_parquet("s3://path-to-parquet/", chunksize="2 GB", dtype=dtypes)
  

Когда я использую модель KNN, она работает нормально, и я вижу, что загрузка графического процессора в это время высока. Это код, который я использовал для подгонки модели:

 from cuml.dask.neighbors import KNeighborsRegressor
from dask_ml.model_selection import train_test_split    

target = "target_lat"
X = train_df.drop(columns=target)
y = train_df[target]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

model = KNeighborsRegressor(n_neighbors=5, client=client)
model.fit(X_train, y_train)
  

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

 predictions = model.predict(X_test)
  

Я ждал почти 24 часа, чтобы, наконец, увидеть результаты метода predict в одном случае. Также было ясно, что загрузка графического процессора во время выполнения метода predict была намного ниже, она упала примерно до 30-40% (это было ~ 100% во время обучения), см. Скриншот ниже:

Загрузка процессора и графического процессора во время метода прогнозирования

Мне могла бы пригодиться помощь в понимании того, почему метод predict занимает так много времени, и если я сделал что-то не так в своем коде. Для справки я следую примеру регрессора KNN, приведенному на этом сайте документации: https://docs.rapids.ai/api/cuml/stable/api.html#id23

Любая помощь будет с благодарностью, спасибо!

Ответ №1:

Документацию для распределенной версии KNN Regressor можно найти здесь .

Вот несколько правил, которым нужно следовать, чтобы получить оптимальную производительность:

  1. Индекс (X_train и y_train) должен состоять из больших разделов, распределенных сбалансированным образом по рабочим.

  2. Запрос (X_test) оптимально должен состоять из разделов, которые имеют количество выборок, кратное параметру batch_size . Их расположение для рабочих не важно.

  3. Параметр batch_size, который определяет, сколько запросов обрабатывается одновременно, может быть установлен на более высокое значение.

Надеюсь, что это полезно!