Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2018 connectés 

 


Utilisez-vous du machine learning dans votre job ?




Attention si vous cliquez sur "voir les résultats" vous ne pourrez plus voter

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  91  92  93  ..  133  134  135  136  137  138
Auteur Sujet :

[Topic Unique] Machine Learning & Data Science

n°33625
Profil sup​primé
Posté le 01-09-2020 à 12:15:18  answer
 

Reprise du message précédent :
Perso on va commencer a utiliser Valohai c'est vraiment vraiment stylé comme outil.

n°33626
flyingchai​r
Posté le 01-09-2020 à 13:15:31  profilanswer
 

giorno_gio75 a écrit :


Et j'aime bien les petites features qu'on peut trouver ailleurs mais ici plus User-Friendly comme le fait d'avoir l'historique de tes modèles à disposition et pouvoir revenir à un ancien modèle que tu trouvais plus performant ou qui répondait mieux à tes besoins métiers.


Mais tellement. Ça évite d’aller essayer de retrouver ton modèle model_data_LH_mars2020_final_v095_final_jure_crache.mon_cul au fin fond d’un dossier...  
[:somberlain111]


Message édité par flyingchair le 01-09-2020 à 13:15:46
n°33627
Rontgen
Posté le 01-09-2020 à 14:56:00  profilanswer
 


Je connaissais pas mais leur video de présentation (https://www.youtube.com/watch?v=jnrSd2nqCWg) est un peu cringe :o

n°33628
Profil sup​primé
Posté le 01-09-2020 à 15:37:06  answer
 

Rontgen a écrit :


Je connaissais pas mais leur video de présentation (https://www.youtube.com/watch?v=jnrSd2nqCWg) est un peu cringe :o


Ils sont magiques c'est des mega geek :D Après c'est vraiment très puissant

 

Cette vidéo est la meilleur.
https://youtu.be/2C-JDpTf22Y


Message édité par Profil supprimé le 01-09-2020 à 15:42:26
n°33629
flyingchai​r
Posté le 09-09-2020 à 22:43:31  profilanswer
 
n°33630
DeltaVega
Ὀδυσσεύς για τους φίλους
Posté le 10-09-2020 à 00:09:59  profilanswer
 

 

Bien plus fun que la vidéo nul a chier postée le post avant. :D


Message édité par DeltaVega le 10-09-2020 à 00:10:19

---------------
Trader en marketing
n°33631
banker38
Posté le 12-09-2020 à 14:10:26  profilanswer
 

Bonjour,  
 
Dans mon service nous commençons à transférer quelques traitements sur python (via la plate-forme Dataiku).  
 
Nous sommes confrontés à un premier problème. Le temps de lecture d'un dataframe avec pandas est juste hyper long. (Df de 10Mio de lignes avec 100 variables).  Les tables sont pourtant stockées dans un datalab récent.  
 
Est ce que vous avez connaissance de package qui permettent d'optimiser les traitements de Dataframe volumineux ?  
 
Merci à tous  

n°33632
joe bonann​o
Bananas
Posté le 12-09-2020 à 14:47:49  profilanswer
 

Quel format?

n°33633
neo world
Posté le 12-09-2020 à 14:54:51  profilanswer
 

banker38 a écrit :

Bonjour,

 

Dans mon service nous commençons à transférer quelques traitements sur python (via la plate-forme Dataiku).

 

Nous sommes confrontés à un premier problème. Le temps de lecture d'un dataframe avec pandas est juste hyper long. (Df de 10Mio de lignes avec 100 variables). Les tables sont pourtant stockées dans un datalab récent.

 

Est ce que vous avez connaissance de package qui permettent d'optimiser les traitements de Dataframe volumineux ?

 

Merci à tous


Une BDD ou un NoSQL (Cassandra ?) ? :O

 

ton DF fait 10MO au total où tu veux dire qu'il y a 10millions de lignes ? qu'es-ce que tu appelles "hyper long" ?

n°33634
giorno_gio​75
Posté le 12-09-2020 à 16:29:19  profilanswer
 

banker38 a écrit :

Bonjour,

 

Dans mon service nous commençons à transférer quelques traitements sur python (via la plate-forme Dataiku).

 

Nous sommes confrontés à un premier problème. Le temps de lecture d'un dataframe avec pandas est juste hyper long. (Df de 10Mio de lignes avec 100 variables).  Les tables sont pourtant stockées dans un datalab récent.

 

Est ce que vous avez connaissance de package qui permettent d'optimiser les traitements de Dataframe volumineux ?

 

Merci à tous

 

Pyspark

 

Et dans une moindre mesure, data.table sous R est excessivement pûissant.


Message édité par giorno_gio75 le 12-09-2020 à 16:29:47
n°33635
o_BlastaaM​oof_o
Posté le 12-09-2020 à 16:43:54  profilanswer
 

banker38 a écrit :

Bonjour,

 

Dans mon service nous commençons à transférer quelques traitements sur python (via la plate-forme Dataiku).

 

Nous sommes confrontés à un premier problème. Le temps de lecture d'un dataframe avec pandas est juste hyper long. (Df de 10Mio de lignes avec 100 variables).  Les tables sont pourtant stockées dans un datalab récent.

 

Est ce que vous avez connaissance de package qui permettent d'optimiser les traitements de Dataframe volumineux ?

 

Merci à tous


Est-ce que tu n'aurais pas tout simplement éclaté la mémoire du serveur ? 10 millions de ligne, ça fait minimum 80 Mo par champ pour des valeurs numériques et au moins 10x plus pour des chaînes de caractère. Pour peu que tout ceci ne soit pas optimisé (ce qui est le cas vu que personne n'optimise jamais rien puisque 99% des data scientists ne pigent rien aux structures de données), ton dataframe va potentiellement peser plusieurs dizaines de Go en mémoire. Puisque c'est du Python, Dataiku l'exécute en local, le process se retrouve donc en concurrence avec tous les autres services qui s'exécutent pour l'accès aux ressources. Au bout d'un moment, il n'y a plus de mémoire dispo => swap => performances très dégradées.

 
giorno_gio75 a écrit :

 

Pyspark

 

Et dans une moindre mesure, data.table sous R est excessivement pûissant.


Ça c'est vraiment la réponse typique du mec qui a découvert Spark y a 3 mois. On va rétablir vite fait quelques vérités...

  • Spark n'est pas nécessairement plus performant qu'une BDD. Donc c'est idiot de le proposer sans savoir quel est le use case associé.
  • Spark n'est pas moins consommateur en mémoire. C'est même le contraire puisqu'il charge tout en mémoire et de manière répliquée. Spark peut bénéficier de la distribution de la donnée en mémoire sur plusieurs noeuds mais si chaque noeud individuellement a trop peu de mémoire, la démarche peut s'avérer contre-productive.


R, je ne vais même pas me fatiguer à commenter :o

 

Faut arrêter avec vos réponses binaires consistant à balancer juste un nom de techno. La bonne façon de traiter de la data, ce n'est pas de la traiter dans une BDD, dans une base NoSQL ou dans Spark. La bonne méthode, c'est d'utiliser le bon outil pour le bon traitement et de faire communiquer ces outils entre eux via un framework commun. Offloader quand c'est nécessaire, déplacer la donnée uniquement quand il le faut.


Message édité par o_BlastaaMoof_o le 12-09-2020 à 16:44:40
n°33636
flyingchai​r
Posté le 12-09-2020 à 16:53:20  profilanswer
 

J’ai une fois eu des gros problèmes de lenteurs avec la création de data frames et c’était effectivement une explosion de la RAM. Comme l’a dit Blast, souvent on réfléchit pas à la place que prennent les datas en mémoire, parce que c’est pas des images ou de la vidéo, ça passe le test sur un petit jeu de données, on lui balance alors toute la sauce, et là, c’est le drame.

n°33637
giorno_gio​75
Posté le 12-09-2020 à 20:44:08  profilanswer
 

o_BlastaaMoof_o a écrit :


Est-ce que tu n'aurais pas tout simplement éclaté la mémoire du serveur ? 10 millions de ligne, ça fait minimum 80 Mo par champ pour des valeurs numériques et au moins 10x plus pour des chaînes de caractère. Pour peu que tout ceci ne soit pas optimisé (ce qui est le cas vu que personne n'optimise jamais rien puisque 99% des data scientists ne pigent rien aux structures de données), ton dataframe va potentiellement peser plusieurs dizaines de Go en mémoire. Puisque c'est du Python, Dataiku l'exécute en local, le process se retrouve donc en concurrence avec tous les autres services qui s'exécutent pour l'accès aux ressources. Au bout d'un moment, il n'y a plus de mémoire dispo => swap => performances très dégradées.

 


 
o_BlastaaMoof_o a écrit :


Ça c'est vraiment la réponse typique du mec qui a découvert Spark y a 3 mois. On va rétablir vite fait quelques vérités...

  • Spark n'est pas nécessairement plus performant qu'une BDD. Donc c'est idiot de le proposer sans savoir quel est le use case associé.
  • Spark n'est pas moins consommateur en mémoire. C'est même le contraire puisqu'il charge tout en mémoire et de manière répliquée. Spark peut bénéficier de la distribution de la donnée en mémoire sur plusieurs noeuds mais si chaque noeud individuellement a trop peu de mémoire, la démarche peut s'avérer contre-productive.


R, je ne vais même pas me fatiguer à commenter :o

 

Faut arrêter avec vos réponses binaires consistant à balancer juste un nom de techno. La bonne façon de traiter de la data, ce n'est pas de la traiter dans une BDD, dans une base NoSQL ou dans Spark. La bonne méthode, c'est d'utiliser le bon outil pour le bon traitement et de faire communiquer ces outils entre eux via un framework commun. Offloader quand c'est nécessaire, déplacer la donnée uniquement quand il le faut.

 

Sous Dataiku t'as pas 36 000 solutions, Spark est une très bonne solution pour outrepasser les limites de RAM et très facile d'accès dans Dataiku d'ailleurs, j'ai juste répondu par rapport à l'outil qu'il utilise, punto :o

 

Si j'ai répondu Spark c'est que je me doute qu'en utilisant Dataiku, il bosse sur du driver et tente de charger un Dataframe énorme mémoire, ce qui est quasi impossible et mauvais.

 

Les deux solutions à ce problème, Spark et data.table, sont très pertinents quoique tu en penses, j'ai pipé plusieurs trucs avec ces deux framework et jamais eu le moindre problèmes de perfs, surtout quand l'organisation a pas forcément des gros moyens d'IT en matière de traitement (pas de clusters/noeuds, pas de grosse mémoire)

 

Et je suis curieux R c'est quoi le problème pour transformer de la data au juste ? J'parle de traitement, pas d'ingénierie des données à tenter de construire des BDD sous R.


Message édité par giorno_gio75 le 12-09-2020 à 20:49:25
n°33638
banker38
Posté le 13-09-2020 à 11:39:41  profilanswer
 

neo world a écrit :


Une BDD ou un NoSQL (Cassandra ?) ? :O  
 
ton DF fait 10MO au total où tu veux dire qu'il y a 10millions de lignes ? qu'es-ce que tu appelles "hyper long" ?


 
C'est une BDD.  
 
Non il y a bien 10Millions de lignes. Le DF fait environ 6Go.
 
Rien que pour le chargement de la base, environ 30 minutes.  
 
Le probleme dans dataiku c'est que lorsque qu'on souhaite travailler dans un notebook il faut charger la table à partir de leur propre package qui permet de transformer la table en Df pandas

n°33639
Ikarez
Posté le 13-09-2020 à 16:45:22  profilanswer
 

Hello,
 
J'aimerais votre avis sur ma situation.
 
Diplômé fin 2019, j'ai commencé en interne dans une bancassurance dans une petite équipe spécialisée en data science/machine learning. Jusqu'à là ça se passe plutôt très bien, plutôt attractif niveau salaire/avantages, les collègues sont sympas, pas vraiment de flicage et assez libre. J'ai appris beaucoup de truc, notamment sur le domaine métier et j'ai eu dès le début beaucoup d'autonomie pour conduire mes projets (j'ai vraiment l'impression d'être pris très au sérieux, par les collègues séniors, le manager et les autres interlocuteurs interne à l'entreprise. Ce qui m'a un peu valu un petit syndrome de l'imposteur au début aussi.)
 
Seulement voilà, en à peu un an, j'ai l'impression d'avoir fait le tour des 2-3 projets intéressants et on commence à me refiler des projets vraiment bateaux sans réelle valeur ajoutée scientifique (limite du reporting tout bête).  
 
Que me conseillez vous pour la suite ? Rester malgré tout parce qu'une expérience d'un an sur le CV c'est trop court et avec le covid le marché est grippé ? Changer de boîte ? Si oui, dans quelle industrie, conseil, tech, éditeur ... ?  
 
Merci

n°33640
giorno_gio​75
Posté le 13-09-2020 à 19:08:21  profilanswer
 

Ikarez a écrit :

Hello,
 
J'aimerais votre avis sur ma situation.
 
Diplômé fin 2019, j'ai commencé en interne dans une bancassurance dans une petite équipe spécialisée en data science/machine learning. Jusqu'à là ça se passe plutôt très bien, plutôt attractif niveau salaire/avantages, les collègues sont sympas, pas vraiment de flicage et assez libre. J'ai appris beaucoup de truc, notamment sur le domaine métier et j'ai eu dès le début beaucoup d'autonomie pour conduire mes projets (j'ai vraiment l'impression d'être pris très au sérieux, par les collègues séniors, le manager et les autres interlocuteurs interne à l'entreprise. Ce qui m'a un peu valu un petit syndrome de l'imposteur au début aussi.)
 
Seulement voilà, en à peu un an, j'ai l'impression d'avoir fait le tour des 2-3 projets intéressants et on commence à me refiler des projets vraiment bateaux sans réelle valeur ajoutée scientifique (limite du reporting tout bête).  
 
Que me conseillez vous pour la suite ? Rester malgré tout parce qu'une expérience d'un an sur le CV c'est trop court et avec le covid le marché est grippé ? Changer de boîte ? Si oui, dans quelle industrie, conseil, tech, éditeur ... ?  
 
Merci


 
Hello,
 
Tu cherches de la VA scientifique ?
 
Pas sûr de comprendre mais si c'est ce que je pense, tu voudrais que tes projets en termes techniques soit évolutif ... mais ça en business je suis pas sûr que tu trouves ton bonheur car on ne choisit pas la technique pour la technique, c'est la problématique métier qui détermine.
 
Ce que tu cherches se trouverait plutôt dans de la R&D ou des boites type Google ou Facebook dans ce profil qui vont inverser le flux et d'abord utiliser la technique pour ensuite y trouver un use case approprié pour vendre le produit ensuite.
 
Perso j'ai rarement vu de telles offres et les seules que j'ai vu étaient chez Google.

n°33641
Ikarez
Posté le 13-09-2020 à 19:43:36  profilanswer
 

Effectivement, je ne parle pas de faire de la R&D. Par VA scientifique, j'entends quelque chose qui te donne vraiment l'impression de mettre à profit tes connaissances.  
 
C'est pas trop l'impression que j'ai quand je dois écrire des requêtes SQL pour faire un simple tableau de reporting tout bête, si tu vois ce que je veux dire. En soi, un peu plus de ML, et un peu moins de Tableau ou Excel.

n°33642
Rontgen
Posté le 13-09-2020 à 21:54:21  profilanswer
 

giorno_gio75 a écrit :


 
Tu cherches de la VA scientifique ?
Pas sûr de comprendre mais si c'est ce que je pense, tu voudrais que tes projets en termes techniques soit évolutif ... mais ça en business je suis pas sûr que tu trouves ton bonheur car on ne choisit pas la technique pour la technique, c'est la problématique métier qui détermine.
Ce que tu cherches se trouverait plutôt dans de la R&D ou des boites type Google ou Facebook dans ce profil qui vont inverser le flux et d'abord utiliser la technique pour ensuite y trouver un use case approprié pour vendre le produit ensuite.
Perso j'ai rarement vu de telles offres et les seules que j'ai vu étaient chez Google.


+1 sur les GAFAM, mais aussi les boites genre NVIDIA et co.
 
Une possibilité aussi serait de viser des boites dont le ML touche vraiment le coeur de métier, comme ca tu auras des moyens et tu feras des trucs plus intéressant que du reporting ou de l'analyse de customer base; d'ou l'idée de la R&D effectivement
 
A la limite peut-etre également des boites de conseil haut de gamme, pour ne pas t'ennuyer toujours sur les memes problématiques?

n°33643
giorno_gio​75
Posté le 14-09-2020 à 15:58:13  profilanswer
 

Ikarez a écrit :

Effectivement, je ne parle pas de faire de la R&D. Par VA scientifique, j'entends quelque chose qui te donne vraiment l'impression de mettre à profit tes connaissances.

 

C'est pas trop l'impression que j'ai quand je dois écrire des requêtes SQL pour faire un simple tableau de reporting tout bête, si tu vois ce que je veux dire. En soi, un peu plus de ML, et un peu moins de Tableau ou Excel.

 

Ah ok là je comprends mieux.

 

Tu te retrouves piégés dans le classique: on te prends en tant que data scientist pour faire des requetes SQL et faire du taf de data analyst, de mon expérience, 90% des DS que j'ai rencontré dans ma vie parisienne se font piéger par ça. Et je me compte dans ces 90%.

 

Pour moi, tu es actuellement un DS pris pour un DA et plus tu t'embourbes dans ça, plus tu le deviens et plus tu perds en compétence ... donc c'est une bonne chose que tu dégages de cette situation avant que ton profil perde en valeur sur le côté DS.

 

Maintenant ton problème ça va être de trouver une entreprise suffisamment sincère qui te fasses pas miroiter du ML, de la data science avancée pour en fait te faire faire des taches de reporting répétitives et ça malheureusement c'est très dur ... du moins en France car à l'étranger on pense pas du tout comme ça.

 

Le timing est pas évident avec le COVID, je pense que plus tu t'éloignes du business traditionnel genre retail, plus tu as de chances de trouver des boîtes sincères qui vont t'estimer en tant que DS.


Message édité par giorno_gio75 le 14-09-2020 à 15:59:50
n°33644
Profil sup​primé
Posté le 17-09-2020 à 14:20:56  answer
 

Salut tout le monde, j'ai un test technique à réaliser et j'aurais besoin de vos lumières.  [:tigrou0007:4]  
 
J'ai un dossier samples_dicom contenant plein de sous-dossiers et certains de ces sous-dossiers contiennent des fichiers DICOM (un format utilisé dans le médical). Ils me demandent :
 

  • 1) D'écrire une fonction qui prends en entrée le path de samples_dicom et qui ouvre chaque fichier DICOM (ça veut dire quoi ça ? Jdois les stocker qq part ? C quoi l'intérêt de juste itérer dessus  [:tigrou0007:4] )


  • 2) De faire la même chose mais "Write multiprocessor version that uses 4 workers"


Autant la 1 même si je suis pas sûr de comprendre ce qu'ils veulent je vois comment faire, autant je suis chaud d'avoir des pointeurs sur comment aborder la question 2 :jap:
 
Merci :jap:

n°33645
flyingchai​r
Posté le 17-09-2020 à 14:30:44  profilanswer
 

Ça sent le CR d’entretien à venir  [:somberlain_xvi:4]  
 
Sinon je peux rien pour toi pour les questions techniques  [:musacorp:5]

n°33646
Profil sup​primé
Posté le 17-09-2020 à 14:35:01  answer
 

flyingchair a écrit :

Ça sent le CR d’entretien à venir  [:somberlain_xvi:4]  
 
Sinon je peux rien pour toi pour les questions techniques  [:musacorp:5]


 
Mon dernier essai, si ça marche pas nique sa mère je go RSA + AAH  [:tigrou0007:4]

n°33647
flyingchai​r
Posté le 17-09-2020 à 14:46:45  profilanswer
 

T’imagines qu’en plus c’est un des domaines les plus dynamiques actuellement. Le problème c’est peut-être pas le machine learning  [:flambi:2]

n°33648
Rontgen
Posté le 17-09-2020 à 15:03:57  profilanswer
 


Lancer un script de machine learning directement sur des fichiers DICOM (un format tellement pourri, complexe et paradoxalement peu standardisé que les gros constructeurs ont des équipes entières rien que pour gérer ca), bon courage à cette boite  [:clooney24] Tu peux me dire c'est laquelle d'ailleurs? en MP si tu veux :o
Il peut y avoir plusieurs raisons a ouvrir des fichiers sans charger directement la totalité en mémoire (ne serait-ce que dans les cas ou tu ne peux pas tout charger d'un coup), par exemple compter le nombre d'images valides, choper des meta-données dans le header,  
 
Pour la 2,  import threading :o


Message édité par Rontgen le 17-09-2020 à 15:05:09
n°33649
Profil sup​primé
Posté le 17-09-2020 à 15:27:07  answer
 

Rontgen a écrit :


Lancer un script de machine learning directement sur des fichiers DICOM (un format tellement pourri, complexe et paradoxalement peu standardisé que les gros constructeurs ont des équipes entières rien que pour gérer ca), bon courage à cette boite  [:clooney24] Tu peux me dire c'est laquelle d'ailleurs? en MP si tu veux :o
Il peut y avoir plusieurs raisons a ouvrir des fichiers sans charger directement la totalité en mémoire (ne serait-ce que dans les cas ou tu ne peux pas tout charger d'un coup), par exemple compter le nombre d'images valides, choper des meta-données dans le header,  
 
Pour la 2,  import threading :o


 
Dans la partie 1 ils parlent pas de faire du ML dessus, juste d'open ces fichiers mais vu qu'ils disent pas quoi en faire jvois pas trop comment répondre à la question
 
C'est suffisant ça ?  
 
https://cdn-images-1.medium.com/max/800/1*cmCmmsXOY_JI5j68yh7knA.png
 
(https://www.kdnuggets.com/2017/03/medical-image-analysis-deep-learning.html)
 
Comment tu fais ça en multi threading ?  [:theo_le_patron]


Message édité par Profil supprimé le 17-09-2020 à 15:37:43
n°33650
Rasthor
Posté le 17-09-2020 à 15:34:39  profilanswer
 


Je ne connais pas ces SSII, mais elles ont l'air populaires en France. :O

n°33651
Profil sup​primé
Posté le 17-09-2020 à 15:37:08  answer
 

https://stackoverflow.com/questions [...] -in-python
 
J'ai trouvé ça, c'est du multiprocessing. Ca compte quand ils disent 4 workers ?  
 
Ptn ça me gonfle c'est pas clair du tout ce qu'ils attendent  [:tigrou0007:4]  [:tigrou0007:4]  [:tigrou0007:4]

n°33652
Rasthor
Posté le 17-09-2020 à 15:38:23  profilanswer
 


J'aime bien Pathlib pour gerer les fichiers. Ca permet plus de flexibilite:
https://docs.python.org/3/library/pathlib.html

Code :
  1. from pathlib import Path
  2. if Path(filename).suffix == ".png"

n°33653
flyingchai​r
Posté le 17-09-2020 à 17:40:20  profilanswer
 


Ça s’appelle un cahier des charge client  [:le petit tiburce:5]

n°33654
Rontgen
Posté le 17-09-2020 à 17:50:26  profilanswer
 

Rasthor a écrit :


J'aime bien Pathlib pour gerer les fichiers. Ca permet plus de flexibilite:
https://docs.python.org/3/library/pathlib.html

Code :
  1. from pathlib import Path
  2. if Path(filename).suffix == ".png"



En l'occurence,

Code :
  1. filename.endswith(".dcm" )


aurait suffi (et est d'ailleurs plus correct et efficace que son "in" ) :o

n°33655
Profil sup​primé
Posté le 17-09-2020 à 22:08:16  answer
 

Rontgen a écrit :


En l'occurence,

Code :
  1. filename.endswith(".dcm" )


aurait suffi (et est d'ailleurs plus correct et efficace que son "in" ) :o


 

Code :
  1. filename, file_extension = os.path.splitext(f)


 
J'ai checké avec ça


Message édité par Profil supprimé le 17-09-2020 à 22:08:48
n°33656
draculax
Posté le 18-09-2020 à 00:08:33  profilanswer
 

y'a glob glob sinon pour trouver tous les fichiers .bidules dans ton repo :o

n°33657
Trefledepi​que_W
Posté le 18-09-2020 à 00:31:14  profilanswer
 

draculax a écrit :

y'a glob glob sinon pour trouver tous les fichiers .bidules dans ton repo :o


 
On peut créer un générateur avec pathlib :o
 

Path(root_dir).glob("**/*.dcm" )

n°33658
o_BlastaaM​oof_o
Posté le 18-09-2020 à 09:31:50  profilanswer
 


Pour info, voici un bout de code que j'ai écrit pour un entretien technique de multiprocessing en bricolant un exécuteur parallèle asynchrone.

 
Spoiler :


# coding: utf-8

 

# In[1]:

 


#ENVIRONMENT SETUP

 

#Import the required libraries
#- pandas for data management
import pandas as pd
#- os and subprocess for system calls
import os
import subprocess as sp
#- time for execution time computation
import time

 

#Helper function for running piped Linux commands easily
def executePipedCommands(cmd):
    procs = []
    for n in range(len(cmd)):
        subprocessCmd = cmd[n].split(" " )
        if n == 0:
            procs.append(sp.Popen(subprocessCmd, stdout=sp.PIPE))
        elif n == len(cmd)-1:
            out = sp.check_output(subprocessCmd, stdin=procs[-1].stdout)
        else:
            procs.append(sp.Popen(subprocessCmd, stdin=procs[-1].stdout, stdout=sp.PIPE))
    return out

 

#processFile is the function used to simulate the processing of a single file
#Here, processFile does not actually process the input file, it simply runs a Linux sleep command
#whose length in proportional to the file's size
#Technically, processFile relies on the subprocess Python package which allows to run system commands
#in async or sync mode (the latter requiring an additional call to the wait() function that waits for
#the command's completion)
#We will use processFile in sync mode for the serial case and in async mode for the parallel case
#since this will allow us to start several concurrent processing tasks without any additional
#parallel processing framework
#Inputs:
#filename: name of the file to process
#sleepFactor: factor to apply to the file size for determining the sleep command length
def processFile(filename, sleepFactor, async=False):
    p = sp.Popen(["sleep", str(os.path.getsize(filename) * sleepFactor)])
    if not async:
        p.wait()
        p.communicate()
        if p.returncode != 0:
            raise Exception("Processing task errored" )
    return p

 

#From now on, the functions below are specifically dedicated to parallel computations

 

#startNewProcessingTask starts a new processing task identified by a task index on a worker
#identified by a worker index
#Inputs:
#fileTable: table of files to process
#sleepFactor: factor to apply to the file size for determining the sleep command length
#worker: worker index, belongs to the [0, (#workers-1)] range
#task: task index, belongs to the [0, (#files-1)] range
def startNewProcessingTask(fileTable, sleepFactor, worker, task, verbose=False):
    #This is for the parallel case, processFile is therefore launched in async mode
    p = processFile(fileTable.at[task, "name"], sleepFactor, async=True)
    if verbose:
        print("Worker " + str(worker) + " starting task " + str(task))
    return p

 

#getNextAssignedTask returns the index of the next task a worker has to run
#If there are no tasks left to run for the worker, the function returns None
#Inputs:
#currentTask: index of the current task
#tasksAssigned: list of all tasks assigned to the worker
def getNextAssignedTask(currentTask, tasksAssigned):
    #Find the index of currentTask in tasksAssigned
    idx = tasksAssigned.index(currentTask)
    if idx == len(tasksAssigned)-1:
        #If currentTask was the last element, return None
        return None
    else:
        #Otherwise return the next value
        return tasksAssigned[idx+1]

 

#parallelProcessing is the function that distributes and handles processing tasks on the workers
#It mainly relies on the input taskAssignment variable which has to be computed beforehand and
#and describes the distribution schemes (it contains for each worker the list of assigned tasks)
#Inputs:
#numFiles: number of files to process
#numWorkers: number of workers to use
#fileTable: table of files to process
#sleepFactor: factor to apply to the file size for determining the sleep command length
#taskAssignment: list of tasks assigned to each worker (the i-th element of taskAssignment is the
#list of tasks assigned to the i-th worker)
def parallelProcessing(numFiles, numWorkers, fileTable, sleepFactor, taskAssignment, verbose=False):
    #Start a timer
    start = time.time()
    #Keep track of completed tasks, globally and for each worker
    numTasksCompleted = 0
    tasksCompleted = [[] for _ in range(numWorkers)]
    #Keep track of the execution time on each worker
    execTimeWorkers = [None] * numWorkers
    #The following lists store the task that is currently executing on each worker,
    #more precisely the task's index in currentTask and the associated process in currentProcess
    #Initialize currentTask with the first element found in taskAssignment
    currentTask = [elem[0] for elem in taskAssignment]
    currentProcess = [None] * numWorkers
    #Start processing and run as long as not all files have been processed
    while numTasksCompleted < numFiles:
        #Loop through workers
        for idx in range(0, numWorkers):
            #The following test checks if the worker has already completed all its tasks,
            #in which case its currentTask would have a None value
            if currentTask[idx] is not None:
                if not currentProcess[idx]:
                    #If the current worker does not have any task assigned yet, start a new one
                    if verbose:
                        print("Worker " + str(idx) + ": no task assigned yet" )
                    currentProcess[idx] = startNewProcessingTask(fileTable, sleepFactor, idx, currentTask[idx])
                else:
                    #Otherwise investigate the running process
                    p = currentProcess[idx]
                    #The following tests checks if the task has terminated
                    if not(p.poll() == None):
                        #If the task has not terminated, there is nothing to do, just move on to the next worker
                        #If it has terminated, we will increase the completed tasks counter and start a new task
                        #Before that, we check the return code to make sure the process terminated successfully
                        p.communicate()
                        if p.returncode != 0:
                            raise Exception("Processing task errored" )
                        #Increase the completed tasks counter and add the index of the completed task to the
                        #worker's list of completed tasks
                        numTasksCompleted += 1
                        tasksCompleted[idx].append(currentTask[idx])
                        if verbose:
                            print("Worker " + str(idx) + ": task " + str(currentTask[idx]) + " completed!" )
                        #Get the next task the worker has to run
                        currentTask[idx] = getNextAssignedTask(currentTask[idx], taskAssignment[idx])
                        if currentTask[idx] is not None:
                            #If there is a task left to run, start it
                            currentProcess[idx] = startNewProcessingTask(fileTable, sleepFactor, idx, currentTask[idx])
                        else:
                            #Otherwise it means that the worker has completed all its tasks
                            #Save the execution time
                            execTimeWorkers[idx] = time.time() - start
    #Before exiting, we check that execution went well by comparing the taskAssignment and tasksCompleted variables
    #which are supposed to be equal
    for idx in range(0, numWorkers):
        t1 = taskAssignment[idx]
        t2 = tasksCompleted[idx]
        if len(t1) != len(t2) or not all([t1[elem] == t2[elem] for elem in range(0, len(t1))]):
            raise Exception("Something went wrong on worker " + str(idx))
    #End the timer and display the execution time
    end = time.time()
    execTimeOverall = end - start
    print("Execution time in PARALLEL mode: %.2f seconds" % execTimeOverall)
    return execTimeOverall, execTimeWorkers

 


# In[2]:

 


#BUILD THE LIST OF FILES TO PROCESS

 

#In  this case, we will use log files of jobs that have run on our server
#We randomly select files larger than 1 kB and smaller than 10 MB
numFiles = 100;
rootPath = "/some/path/"
cmd = ["find " + rootPath + " -type f -name *log* -size -10000k -size +1k -printf '%s\t%p\n", "shuf -n " + str(numFiles)]
out = executePipedCommands(cmd)

 

#Get the file list from the commands output
fileList = out.split("\n" )

 

#At the end of the list is an extra empty element that we need to discard
fileList = fileList[0:-1]

 

#Get the size of each file: the size is the first field in each element of fileList
#The file size is also preceded by a single quote character that we need to discard
fileSize = [int(elem[1:len(elem)].split("\t" )[0]) for elem in fileList]

 

#Compute a 'sleep factor' so that the serial execution runs in around 1 minute
sleepFactor = 60.0 / sum(fileSize)

 

#The file name is the second field in each element of fileList
fileName = [elem.split("\t" )[1] for elem in fileList]

 

#Create a single table concatenating name and size data
fileTable = pd.DataFrame({"name":fileName, "size":fileSize})

 

print(fileTable)

 


# In[3]:

 


#SERIAL FILE PROCESSING

 

#We run the processing a first time in serial mode with the aim of getting the execution time
#in serial mode so we can compute the parallel speed-up

 

start = time.time()
for idx in range(0, len(fileTable.index)):
    processFile(fileTable.at[idx, "name"], sleepFactor, async=False)
end = time.time()
execTimeSerial = end - start;

 

print("Execution time in SERIAL mode: %.2f seconds" % execTimeSerial)

 


# In[4]:

 


#PARALLEL FILE PROCESSING - Naive version

 

#We start with the 'naive' distribution of tasks, which consists in the following:
#Assume there are M files and N workers
#File indices range from 0 to M-1, worker indices from 0 to N-1
#The i-th worker processes all files for which mod(file index, M) == i

 

#Use 4 workers
numWorkers = 4

 

#Generate the task distribution scheme
taskAssignmentNaive = [[] for _ in range(numWorkers)]
for idx in range(0, numWorkers):
    taskAssignmentNaive[idx] = [elem for elem in range(0, numFiles) if elem%numWorkers == idx]
    print("Tasks assigned to worker " + str(idx) + ":" )
    print(taskAssignmentNaive[idx])
print("\n" )

 

#Run processing tasks
execTimeParallelNaive, execTimeWorkersNaive = parallelProcessing(numFiles, numWorkers, fileTable, sleepFactor, taskAssignmentNaive)
print("\nParallel speed up: %.2fx" % (execTimeSerial / execTimeParallelNaive))
print("Execution time on the individual workers: " + ", ".join(["%.2f" % elem for elem in execTimeWorkersNaive]))

 

#As we can see below, the parallel speed up is suboptimal and there is a significant skew
#among workers' individual execution times
#The overall execution time actually is the execution time seen on the worker which took the most time
#to complete its tasks

 


# In[5]:

 


#PARALLEL FILE PROCESSING - Optimized version

 

#The optimized version focuses on building a more elaborate distribution scheme
#In pseudo code, it reads like this:
#    - sort the list of files to process according to file size in descending order
#    - keep track of the expected workload on each worker, initializing it to zero
#    - loop over the sorted list of files to process
#         - at each step, look for the worker which has the least work to do
#         - assign the next task to this worker
#         - increment this worker's expected workload with the file size
#This will end up with a different task assignment with a lower skew

 

#Sort the table of files to process as indicated above: according to file size in descending order
fileTableSorted = fileTable.sort_values(by=["size"], ascending=False, inplace=False)
fileTableSorted = fileTableSorted.reset_index(drop=True)

 

#Build the new distribution scheme, keeping track of the expected workload on each worker
taskAssignmentOptimized = [[] for _ in range(numWorkers)]
expectedWorkload = [0] * numWorkers
for idxFile in range(0, numFiles):
    #Look for worker with the minimum workload
    idxWorker = expectedWorkload.index(min(expectedWorkload))
    taskAssignmentOptimized[idxWorker].append(idxFile)
    expectedWorkload[idxWorker] += fileTableSorted.at[idxFile, "size"]

 

#Display the optimized task assignment
for idx in range(0, numWorkers):
    print("Tasks assigned to worker " + str(idx) + ":" )
    print(taskAssignmentOptimized[idx])
print("\n" )

 

#Display the expected workload
print("Expected workload on each worker: " + ", ".join(["%.2f" % elem for elem in expectedWorkload]) + "\n" )

 

#Run processing tasks
execTimeParallelOptimized, execTimeWorkersOptimized = parallelProcessing(numFiles, numWorkers, fileTableSorted, sleepFactor, taskAssignmentOptimized)
print("\nParallel speed up: %.2fx" % (execTimeSerial / execTimeParallelOptimized))
print("Execution time on the individual workers: " + ", ".join(["%.2f" % elem for elem in execTimeWorkersOptimized]))

 

#As we can see below, the parallel speed up is now much better and the skew has been nearly eliminated



Message édité par o_BlastaaMoof_o le 18-09-2020 à 11:44:45
n°33659
rokhlan
Posté le 22-09-2020 à 15:12:54  profilanswer
 

Y'en a ici qui font de la prédiction d'anomalies sur des composants Hadoop ?
 
Genre prédire qu'il va y avoir un problème à partir des métriques ?
 
C'est ce qu'on me demande de faire et je trouve ça chiant :/


Message édité par rokhlan le 22-09-2020 à 19:17:51
n°33660
Profil sup​primé
Posté le 22-09-2020 à 16:01:50  answer
 

Le fait pas ou refile ça à un stagios

n°33661
rokhlan
Posté le 22-09-2020 à 19:18:32  profilanswer
 

C'est moi l'alternant à qui on a refilé ça [:humanrage:5]

n°33662
Profil sup​primé
Posté le 22-09-2020 à 20:20:42  answer
 

rokhlan a écrit :

C'est moi l'alternant à qui on a refilé ça [:humanrage:5]


 
tg et code victime  [:filoufillon:9]

n°33663
flyingchai​r
Posté le 22-09-2020 à 20:22:54  profilanswer
 

Fig 2 - Le ML, une truanderie aussi pour les employés

n°33664
Profil sup​primé
Posté le 22-09-2020 à 20:33:35  answer
 

Jme suis fait gank ce matin d'ailleurs  [:filoufillon:9]  
 
Hier soir le chasseur de tête me propose un petit call pour ce matin dans le but d'expliciter le rendu technique qu'ils attendaient de moi. Jme réveille avec un SMS "en fait notre call s'est transformé en call de 30 min avec le CEO lol mais tkt ça va bien se passer frero" et ce fameux call de 30 min avec le CEO c'était en fait 45 min de fit avec le CEO et 1h30 d'entretien technique avec les 2 teams ingé  [:theo_le_patron]  
 
Le bon côté c'est que là c'est fait au moins, alea iacta est [:theo_le_patron]

n°33665
neo world
Posté le 22-09-2020 à 20:48:40  profilanswer
 

rokhlan a écrit :

C'est moi l'alternant à qui on a refilé ça [:humanrage:5]


Pas mal, vous bossez pas ensemble ? :o

 

C'est quoi le type de pannes le plus fréquent et/ou le plus pénalisant sur le cluster ?

 

En termes de logs il y a déjà tout ? Sur un ELK ou autre ?

 

Tu as un historique des incidents ? (Timestamps en particulier) accès aux outils de monitoring également ?

 

Il y a eu des tentatives précédentes de maintenance prédictives ? Tu as tenté quoi jusqu'à présent ?

 

Bienvenue dans le monde impitoyable des entreprises :D

 Page :   1  2  3  4  5  ..  91  92  93  ..  133  134  135  136  137  138

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Topic unique] Veille IA - Actu, lectures, podcasts & documentaires[Topic Unique] Claude by Anthropic
[Topic unique] IA générative de texte, ChatGPT, Copilot, Gemini & co 
Plus de sujets relatifs à : [Topic Unique] Machine Learning & Data Science


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)