...
Ray je sučelje za raspodijeljeni proračun najpoznatijih knjižnica za strojno učenje kojim se nastoji olakšati razvoj i korištenje ML aplikacija na više procesorskih jedinica i/ili čvorova. U svojoj osnovi, sastoji se od sučelja Ray Core koje omogućava razvoj distribuiranog koda kroz korištenje dekoratora, no najveću funkcionalnost pruža kroz sučelja koja raspodjeljuju dijelove tipičnog machine learning pipelinea:
- Ray Data za rukovanje podacima
- Ray Train za treniranje modela
- Ray Tune za optimizaciju hiperparametara
- Ray RLlib za ojačano učenje
Verzije
verzija | modul | python | Supek | Padobran |
---|---|---|---|---|
2.4.0 | scientific/ray/2.4.0-rayproject | 3.9 |
Dokumentacija
(TBC)
Primjeri
2.10.0 | scientific/ray/v2.10.0 | 3.8 |
|
Note | ||
---|---|---|
| ||
Python aplikacije i knjižnice na Supeku su dostavljene u obliku kontejnera i zahtijevaju korištenje wrappera kao što je opisano ispod. Više informacija o python aplikacijama i kontejnerima na Supeku možete dobiti na sljedećim poveznicama: |
Dokumentacija
- Službena dokumentacija - https://www.ray.io/
- Priručnik - https://docs.ray.io/en/latest
Primjeri pokretanja na Supeku
Ispod se Ispod se nalaze neki primjeri funckionalnosti koje Ray pruža poput:
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#!/bin/bash #PBS -l select=2:ngpus=2:ncpus=16 #PBS -e output/ #PBS -o output/ # environment module load scientific/ray/2.4.0-rayproject # cd cd ${PBS_O_WORKDIR:-""} # run ray-launcher.sh train-pytorch.py |
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#!/bin/bash #PBS -l select=2:ngpus=2:ncpus=16 #PBS -e output/ #PBS -o output/ # environment module load scientific/ray/2.4.0-rayproject # cd cd ${PBS_O_WORKDIR:-""} # run ray-launcher.sh tune-tensorflow.py |
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#!/bin/bash #PBS -l select=12:ngpus=1:ncpus=4 #PBS -e output/ #PBS -o output/4 # environment # module load scientific/ray/2.4.0-rayproject # cd cd ${PBS_O_WORKDIR:-""} # run ray-launcher.sh sklearn-automl.py |
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
# sources:
# 1) data - https://archive.ics.uci.edu/dataset/15/breast+cancer+wisconsin+original
import os
import glob
import numpy as np
import pandas as pd
import itertools
import ray
from ray import air, tune
from ray.air import Checkpoint, session
from ray.train.sklearn import SklearnTrainer
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_validate
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neural_network import MLPClassifier
def get_estimators(estimators):
for model, options in estimators.items():
options_cross = itertools.product(*options.values())
options_keys = options.keys()
for options_row in options_cross:
yield model(**{key: value for key, value in zip(options_keys, options_row)})
def cross_validate_config(config, data):
# X, y
df = data.to_pandas()
X = df.drop(columns=['id-number', 'diagnosis'])
y = df['diagnosis'].map({'M': 1, 'B': 0})
# cv
result = cross_validate(estimator=config['estimator'],
X=X,
y=y,
scoring="f1",
n_jobs=1)
# output
results = { "f1": result['test_score'].mean() }
session.report(results)
def main():
# train, test
data = ray.data.read_csv('wdbc.data')
train, test = data.train_test_split(test_size=0.2)
# estimator space
estimators = {
SVC: {
'kernel': ['linear',
'poly',
'rbf',
'sigmoid'],
'C': [1,
4,
16],
},
DecisionTreeClassifier: {
'max_depth': [None,
2,
8,
32],
'splitter': ['best',
'random'],
},
KNeighborsClassifier: {
'algorithm': ['auto',
'ball_tree',
'kd_tree',
'brute'],
'weights': ['uniform',
'distance'],
},
MLPClassifier: {
'hidden_layer_sizes': [10,
40,
160],
'activation': ['identity',
'logistic',
'tanh'],
},
}
estimators = list(get_estimators(estimators))
# grid search
trainable = tune.with_parameters(cross_validate_config, data=train)
param_space = {"estimator": tune.grid_search(estimators),
"n_splits": 5}
tune_config = tune.TuneConfig(metric="f1",
mode="max")
tuner = tune.Tuner(trainable=trainable,
param_space=param_space,
tune_config=tune_config)
result_grid = tuner.fit()
best_result = result_grid.get_best_result()
print(best_result)
print(best_result.config)
if __name__ == '__main__':
import ray
ray.init(address='auto',
_node_ip_address=os.environ['NODE_IP_ADDRESS'])
main() |
...
)
if __name__ == '__main__':
import ray
ray.init(address='auto',
_node_ip_address=os.environ['NODE_IP_ADDRESS'])
main() |
Primjer pokretanja na Padobranu
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#!/bin/bash
#PBS -q cpu
#PBS -l select=1:ncpus=20:mem=20GB
# environment
module load scientific/ray/v2.10.0
# cd
cd ${PBS_O_WORKDIR}
# run
ray-run python3 ime_vase_py_skripte.py |
Napomene za pokretanje na Supeku
Tip | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
Za ispravno korištenje knjižnice Ray, dostavljen je wrapper ray-launcher.sh koji osigurava pravilno zauzimanje dodijeljenih resursa stvaranjem Ray klastera i omogućava pokretanje aplikacija kroz ray.init API U skripti posla PBS, potrebno je pozvati skriptu Python na sljedeći način:
Dok se u skripti Python sučelje Ray incijalizira na sljedeći način:
|
...