129 lines
3.7 KiB
Python
129 lines
3.7 KiB
Python
# flake8: noqa
|
|
# isort: skip_file
|
|
|
|
# __lightgbm_start__
|
|
import pandas as pd
|
|
import lightgbm as lgb
|
|
|
|
# 1. Load your data as a `lightgbm.Dataset`.
|
|
train_df = pd.read_csv("s3://ray-example-data/iris/train/1.csv")
|
|
eval_df = pd.read_csv("s3://ray-example-data/iris/val/1.csv")
|
|
|
|
train_X = train_df.drop("target", axis=1)
|
|
train_y = train_df["target"]
|
|
eval_X = eval_df.drop("target", axis=1)
|
|
eval_y = eval_df["target"]
|
|
|
|
train_set = lgb.Dataset(train_X, label=train_y)
|
|
eval_set = lgb.Dataset(eval_X, label=eval_y)
|
|
|
|
# 2. Define your LightGBM model training parameters.
|
|
params = {
|
|
"objective": "multiclass",
|
|
"num_class": 3,
|
|
"metric": ["multi_logloss", "multi_error"],
|
|
"verbosity": -1,
|
|
"boosting_type": "gbdt",
|
|
"num_leaves": 31,
|
|
"learning_rate": 0.05,
|
|
"feature_fraction": 0.9,
|
|
"bagging_fraction": 0.8,
|
|
"bagging_freq": 5,
|
|
}
|
|
|
|
# 3. Do non-distributed training.
|
|
model = lgb.train(
|
|
params,
|
|
train_set,
|
|
valid_sets=[eval_set],
|
|
valid_names=["eval"],
|
|
num_boost_round=100,
|
|
)
|
|
# __lightgbm_end__
|
|
|
|
|
|
# __lightgbm_ray_start__
|
|
import lightgbm as lgb
|
|
|
|
import ray.train
|
|
from ray.train.lightgbm import LightGBMTrainer, RayTrainReportCallback
|
|
|
|
# 1. Load your data as a Ray Data Dataset.
|
|
train_dataset = ray.data.read_csv("s3://anonymous@ray-example-data/iris/train")
|
|
eval_dataset = ray.data.read_csv("s3://anonymous@ray-example-data/iris/val")
|
|
|
|
|
|
def train_func():
|
|
# 2. Load your data shard as a `lightgbm.Dataset`.
|
|
|
|
# Get dataset shards for this worker
|
|
train_shard = ray.train.get_dataset_shard("train")
|
|
eval_shard = ray.train.get_dataset_shard("eval")
|
|
|
|
# Convert shards to PyArrow tables. LightGBM (>=4.2.0) supports PyArrow
|
|
# natively, which avoids a round-trip through pandas.
|
|
import pyarrow as pa
|
|
|
|
train_table = pa.concat_tables(
|
|
train_shard.iter_batches(batch_format="pyarrow", batch_size=None)
|
|
)
|
|
eval_table = pa.concat_tables(
|
|
eval_shard.iter_batches(batch_format="pyarrow", batch_size=None)
|
|
)
|
|
|
|
train_X = train_table.drop(["target"])
|
|
train_y = train_table.column("target")
|
|
eval_X = eval_table.drop(["target"])
|
|
eval_y = eval_table.column("target")
|
|
|
|
train_set = lgb.Dataset(train_X, label=train_y)
|
|
eval_set = lgb.Dataset(eval_X, label=eval_y)
|
|
|
|
# 3. Define your LightGBM model training parameters.
|
|
params = {
|
|
"objective": "multiclass",
|
|
"num_class": 3,
|
|
"metric": ["multi_logloss", "multi_error"],
|
|
"verbosity": -1,
|
|
"boosting_type": "gbdt",
|
|
"num_leaves": 31,
|
|
"learning_rate": 0.05,
|
|
"feature_fraction": 0.9,
|
|
"bagging_fraction": 0.8,
|
|
"bagging_freq": 5,
|
|
# Adding the lines below are the only changes needed
|
|
# for your `lgb.train` call!
|
|
"tree_learner": "data_parallel",
|
|
"pre_partition": True,
|
|
**ray.train.lightgbm.get_network_params(),
|
|
}
|
|
|
|
# 4. Do distributed data-parallel training.
|
|
# Ray Train sets up the necessary coordinator processes and
|
|
# environment variables for your workers to communicate with each other.
|
|
model = lgb.train(
|
|
params,
|
|
train_set,
|
|
valid_sets=[eval_set],
|
|
valid_names=["eval"],
|
|
num_boost_round=100,
|
|
# Optional: Use the `RayTrainReportCallback` to save and report checkpoints.
|
|
callbacks=[RayTrainReportCallback()],
|
|
)
|
|
|
|
|
|
# 5. Configure scaling and resource requirements.
|
|
scaling_config = ray.train.ScalingConfig(num_workers=2, resources_per_worker={"CPU": 2})
|
|
|
|
# 6. Launch distributed training job.
|
|
trainer = LightGBMTrainer(
|
|
train_func,
|
|
scaling_config=scaling_config,
|
|
datasets={"train": train_dataset, "eval": eval_dataset},
|
|
)
|
|
result = trainer.fit()
|
|
|
|
# 7. Load the trained model.
|
|
model = RayTrainReportCallback.get_model(result.checkpoint)
|
|
# __lightgbm_ray_end__
|