#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 можно найти здесь .
Вот несколько правил, которым нужно следовать, чтобы получить оптимальную производительность:
-
Индекс (X_train и y_train) должен состоять из больших разделов, распределенных сбалансированным образом по рабочим.
-
Запрос (X_test) оптимально должен состоять из разделов, которые имеют количество выборок, кратное параметру batch_size . Их расположение для рабочих не важно.
-
Параметр batch_size, который определяет, сколько запросов обрабатывается одновременно, может быть установлен на более высокое значение.
Надеюсь, что это полезно!