Le multithreading, ou exécution concurrente de threads, permet des gains de performance substantiels par rapport à une exécution séquentielle. Pour les procédures s'exécutant dans CAS, le nombre de threads est déterminé par l'installation. Le modèle de multithreading est principalement basé sur la division des données traitées sur une seule machine entre les threads disponibles. Par exemple, si une table de 1 000 observations est traitée par quatre threads, chaque thread gère 250 observations. Toutes les opérations accédant aux données (comme la normalisation des variables, la formation de matrices, le calcul d'objectifs, de gradients, de Hessiennes, et le scoring d'observations) sont alors multithreadées. Les opérations matricielles bénéficient également du multithreading si la taille des matrices est suffisante pour justifier la gestion de multiples threads.
Analyse des données
Type : CREATION_INTERNE
Les exemples utilisent des données générées (datalines) ou des tables SASHELP pour garantir leur autonomie.
1 Bloc de code
PROC FACTMAC Data
Explication : Cet exemple illustre une utilisation basique de la procédure FACTMAC. Il commence par créer une petite table de données en mémoire CAS (`casuser.produits`). Ensuite, `PROC FACTMAC` est exécutée sur cette table, spécifiant un modèle simple où 'prix' est la variable dépendante et 'produit' et 'stock' sont les prédicteurs. Le résultat est sauvegardé dans une nouvelle table CAS, 'casuser.factmac_output'. Le multithreading est géré automatiquement par le serveur CAS pour optimiser les calculs, en répartissant les observations entre les threads disponibles.
Copié !
/* Création d'une table CAS simple pour la démonstration */
data casuser.produits;
input produit $ prix stock;
datalines;
Pomme 1.0 100
Banane 0.5 200
Orange 1.2 150
Poire 0.8 120
Raisin 2.5 50
;
run;
/* Exécution basique de PROC FACTMAC */
proc factmac data=casuser.produits;
model prix = produit stock;
output out=casuser.factmac_output;
run;
/* Affichage des résultats (partiel) */
proc print data=casuser.factmac_output (obs=5);
run;
proc casutil incaslib="casuser";
droptable casdata="produits" quiet;
droptable casdata="factmac_output" quiet;
run;
1
/* Création d'une table CAS simple pour la démonstration */
2
DATA casuser.produits;
3
INPUT produit $ prix stock;
4
DATALINES;
5
Pomme 1.0100
6
Banane 0.5200
7
Orange 1.2150
8
Poire 0.8120
9
Raisin 2.550
10
;
11
RUN;
12
13
/* Exécution basique de PROC FACTMAC */
14
PROC FACTMACDATA=casuser.produits;
15
model prix = produit stock;
16
OUTPUT out=casuser.factmac_output;
17
RUN;
18
19
/* Affichage des résultats (partiel) */
20
PROC PRINTDATA=casuser.factmac_output (obs=5);
21
RUN;
22
23
PROC CASUTIL incaslib="casuser";
24
droptable casdata="produits" quiet;
25
droptable casdata="factmac_output" quiet;
26
RUN;
2 Bloc de code
PROC FOREST Data
Explication : Cet exemple utilise `PROC FOREST` pour entraîner un modèle de forêt aléatoire afin de prédire la loyauté d'un client. Il inclut des options courantes telles que `NTREE` pour spécifier le nombre d'arbres à construire, `MAXDEPTH` pour la profondeur maximale des arbres, et `SEED` pour la reproductibilité. Les calculs intensifs de construction d'arbres et de traitement des données sont automatiquement parallélisés par CAS sur plusieurs threads, accélérant l'entraînement du modèle. Les résultats et le modèle entraîné sont sauvegardés dans des tables CAS.
Copié !
/* Création d'une table CAS pour la démonstration de classification */
data casuser.clients;
call streaminit(123);
do i=1 to 1000;
age = rand('uniform', 18, 65);
revenu = rand('normal', 50000, 15000);
satisfaction_produit = ceil(rand('uniform', 1, 5));
if revenu > 60000 and age > 30 then
loyal = 1;
else
loyal = 0;
output;
end;
drop i;
run;
/* Exécution de PROC FOREST avec des options courantes */
proc forest data=casuser.clients;
input age revenu satisfaction_produit;
target loyal;
ods output FitStatistics=casuser.forest_stats;
train ntree=100 seed=1234 maxdepth=10;
save rstore=casuser.forest_model;
run;
/* Affichage des statistiques d'ajustement */
proc print data=casuser.forest_stats;
run;
proc casutil incaslib="casuser";
droptable casdata="clients" quiet;
droptable casdata="forest_stats" quiet;
droptable casdata="forest_model" quiet;
run;
1
/* Création d'une table CAS pour la démonstration de classification */
/* Exécution de PROC FOREST avec des options courantes */
18
PROC FORESTDATA=casuser.clients;
19
INPUT age revenu satisfaction_produit;
20
target loyal;
21
ods OUTPUT FitStatistics=casuser.forest_stats;
22
train ntree=100 seed=1234 maxdepth=10;
23
save rstore=casuser.forest_model;
24
RUN;
25
26
/* Affichage des statistiques d'ajustement */
27
PROC PRINTDATA=casuser.forest_stats;
28
RUN;
29
30
PROC CASUTIL incaslib="casuser";
31
droptable casdata="clients" quiet;
32
droptable casdata="forest_stats" quiet;
33
droptable casdata="forest_model" quiet;
34
RUN;
3 Bloc de code
PROC NNET Data
Explication : Cet exemple démontre le scoring de données avec un modèle d'apprentissage automatique, en se basant sur une approche courante où un modèle (comme NNET) serait entraîné et ensuite utilisé pour prédire sur de nouvelles données. Bien que `PROC NNET` elle-même ne soit pas explicitement appelée pour l'entraînement ici (pour simplifier la démonstration sans un modèle pré-existant complexe), le concept de scoring d'un grand volume de données est très pertinent pour le multithreading. Le Data Step s'exécute directement sur les données en mémoire CAS, et CAS distribue automatiquement les tâches de calcul (ici, la simulation de scoring) sur plusieurs threads, permettant un traitement efficace des ensembles de données volumineux.
Copié !
/* Création d'une table CAS avec des données de test */
data casuser.test_data;
call streaminit(456);
do i=1 to 200;
age = rand('uniform', 20, 70);
revenu = rand('normal', 60000, 20000);
satisfaction_produit = ceil(rand('uniform', 1, 5));
output;
end;
drop i;
run;
/* Utilisation d'un modèle NNET pré-entraîné (ici, simulé par des coefficients simples) */
/* Dans un scénario réel, un modèle NNET serait entraîné et sauvegardé */
/* Ici, nous simulons l'étape de scoring */
data casuser.scored_data;
set casuser.test_data;
/* Simulation d'un scoring simple basé sur les inputs */
score_loyal = 0.5 + 0.01 * age + 0.00001 * revenu - 0.1 * satisfaction_produit;
if score_loyal > 0.7 then predicted_loyal = 1; else predicted_loyal = 0;
run;
/* Affichage des données scorées */
proc print data=casuser.scored_data (obs=10);
run;
proc casutil incaslib="casuser";
droptable casdata="test_data" quiet;
droptable casdata="scored_data" quiet;
run;
1
/* Création d'une table CAS avec des données de test */
Explication : Cet exemple utilise `PROC GRADBOOST` pour entraîner un modèle de boosting de gradient sur des données de ventes, en tirant parti des capacités distribuées de CAS. La clause `PARTITION region_id` indique à CAS de traiter les données par région, ce qui peut améliorer les performances et la scalabilité en distribuant les calculs sur les nœuds CAS. Chaque partition peut être traitée en parallèle par plusieurs threads. Bien qu'il n'y ait pas d'option `NTHREADS` explicite ici, le serveur CAS sous-jacent allouera automatiquement et efficacement les ressources de traitement (c'est-à-dire les threads) en fonction de la configuration de l'environnement et de la taille des données, maximisant l'avantage du multithreading pour l'entraînement du modèle.
Copié !
/* Création d'une table CAS avec une variable de partitionnement */
data casuser.ventes;
call streaminit(789);
do i=1 to 5000;
region_id = ceil(rand('uniform', 1, 4)); /* 4 régions */
publicite = rand('uniform', 0, 1000);
prix = rand('uniform', 10, 100);
ventes_reelles = 500 + 2 * publicite - 3 * prix + (region_id * 100) + rand('normal', 0, 50);
output;
end;
drop i;
run;
/* Utilisation de PROC GRADBOOST avec PARTITION et options de thread (implicites CAS) */
proc gradboost data=casuser.ventes;
input publicite prix;
target ventes_reelles;
partition region_id;
/* Les options de multithreading sont gérées par le serveur CAS. */
/* L'option NTHREADS peut être utilisée dans certaines procs pour limiter explicitement. */
/* Ici, nous laissons CAS gérer l'allocation automatique des threads par défaut. */
ods output IterationHistory=casuser.gradboost_hist;
run;
/* Affichage de l'historique d'itération */
proc print data=casuser.gradboost_hist (obs=10);
run;
proc casutil incaslib="casuser";
droptable casdata="ventes" quiet;
droptable casdata="gradboost_hist" quiet;
run;
1
/* Création d'une table CAS avec une variable de partitionnement */
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.