[avis] nVidia CUDA pour la bioinformatique

Axilatis

Elite



Bonjour !

Je vous expose donc mon petit projet ^^

Je dispose en classe d'une dizaine de PC fixes strictement identiques.
Ils possèdent tous une carte graphique nVidia compatible CUDA.
(Il me semble que ce sont des 8800GTS mais je confirme au plus vite).

Mon but est de faire un petit cluster dans un but bioinformatique : alignement de protéines
Ce qu'est un alignement de séquence (protéine ou ADN, le concept est identique).

- 1 PC = serveur SOAP qui génère les combinaisons et envoit les séquences à aligner
- autres PCs = clients SOAP qui testent les données envoyées et retournent le score d'alignement.
- les OS utilisés : 1 client en Ubuntu (UNIX), le serveur et les autres clients en Gentoo (UNIX) (ps : c'est imposé, petit "défi" j'imagine...)






L'échange de données Clien <=> Serveur se fera par SOAP.
1 Serveur SOAP.
9 ou 10 clients SOAP (je ne sais plus exactement) qui executeront la tâche, il y aura certainement un petit script python à gauche ou à droite et forcément le logiciel/algorithme qui fera l'alignement et retournera le résultat, pour ensuite redemander de nouvelles données à aligner.

Bref je me tourne vers vous pour écouter vos conseils, vos avis, des idées sur la démarche à suivre.

Comme vous vous en doutez, ceci est un projet d'étude qui sera évalué. Je ne vous demande certainement pas de faire le travail à ma place, mais j'aimerais quelques pistes.
Peut-être se cache parmi vous un averti de CUDA qui pourrait m'aiguiller du moins pour le début?? :)


D'avance, merci pour tout commentaire constructif !! :-D

~Axilatis~
 

Ser!al

Elite
J'y connais rien en alignement de protéines ni en cartes graphique CUDA mais j'ai l'impression que la plus grosse charge du travail résidera dans la construction d'un simple "client" pouvant utiliser la carte graphique par un algorithme d'alignement.
Une fois que t'auras codé (ou récupéré) un algo et que tu l'auras fait tourné avec les cartes, le reste devrait aller tout seul.
Tout dépend aussi de tes bases en SOAP et le langage utilise par CUDA (j'ai cru voir du C mais je sais pas s'il y a d'autres possibilités).

En tout cas, bonne chance :-D
 
1er
OP
Axilatis

Axilatis

Elite
Merci à toi Ser!al pour ton avis, je pense que tu as raison, le plus difficile sera du côté client et surtout l'exploitation des possibilités offertes par CUDA.
Je continue mes recherches ;)
 

eGm_

Gibon Blasé
Il y a un article dans le dernier Programmez sur la programmation CUDA
 
1er
OP
Axilatis

Axilatis

Elite
enfait j'ai besoin de l'algorithme de Smith-Watermann, adapté à CUDA.
Apparemment il faut aller faire un kernel sur mesure pour le GPU,
putain ça a l'air vraiment chaud...
 
juste une question : à part le fun, ça t'apportera quoi ?
 
1er
OP
Axilatis

Axilatis

Elite
la réussite de mon examen de techniques bioinformatiques... ^^)
sachant que toute la classe va utiliser les CPU des pc fixes, et qu'avec
l'utilisation GPGPU (CUDA) je peux gagner un facteur temps de 2x à 50x.
 
Ah donc tu es prof et en même temps étudiant ?
 

Le_Pev

Elite
Tu te mets un max de contraintes :D

Je ne l'ai jamais fais, mais je crois que le chemin le plus simple serait de dévelloper la partie algorithme sous Matlab/Scilab et de faire accélerer le calcul par Cuda dans Matlab/Scilab. En plus l'algo dont tu parles est dans matlab. Il y a un tuto aussi.

Sinon j'ai trouvé ça http://www.nvidia.com/object/swplusplus_on_tesla.html mais il ne fonctionne que sur une machine (tu peux la bourré de carte lol ) mais pas en distribué.
 
Enfin, moi je connais pas " l'énormité " de la masse de calcul. Mais réfléchi quand même au temps que ça va te prendre pour coder et lancer tout ça.

C'est clair une fois que tout est installé, ça sera du gain à chaque simul, mais si tu dois en faire une seule, ça ira ptet plus vite de le lancer bêtement sur un pc et d'attendre un temps de simul 10-20 fois plus long mais qui ne prendra pas le temps qu'il t'aura fallu pour tout mettre en place.
 

Lagwagon

Jésus
Staff
Enfin, moi je connais pas " l'énormité " de la masse de calcul. Mais réfléchi quand même au temps que ça va te prendre pour coder et lancer tout ça.

C'est clair une fois que tout est installé, ça sera du gain à chaque simul, mais si tu dois en faire une seule, ça ira ptet plus vite de le lancer bêtement sur un pc et d'attendre un temps de simul 10-20 fois plus long mais qui ne prendra pas le temps qu'il t'aura fallu pour tout mettre en place.
je pense que vu que c'est quoté, ta solution ne va pas plaire à son prof :-D
 

Groszours

Elite
Tu peux expliquer les alignements que tu fais et qui demande tant de puissance de calcul ?
 
1er
OP
Axilatis

Axilatis

Elite
Bon, alors c'est parti, je vais essayer de simplifier au maximum.^^)

- Une protéine est un polymère d'acides aminés (AAs) qui se suivent les uns derrière les autres, tout comme les lettres se suivent dans une phrase.

- Il existe 20 Acides aminés naturels. Chaque Acide aminé est désigné par une lettre de l'alphabet :




exemple de séquence protéique a dit:
>gi|454922|emb|CAA54776.1| haemoglobin [Casuarina glauca] EALLKQSWEVLKQNIPGHSLCLFALIIEAAPESKYVFSFLKDSNEIPENNPKLKAHAAVIFKTICESATELRQKGQAVWDNNTLKRLGSIHLKNKITDPHFEVMKGALLGTIKEAVKENWSDEMCCAWTEAYNQLVATIK AEMKE
=> Vous voyez donc que finalement on peut réduire une protéine à une phrase. <=

Un alignement de protéine consiste à prendre 2 séquences différentes (on parle d'alignement pair) ou plusieurs (alignement multiple) et à essayer d'aligner au mieux leurs composants (lettres) afin de trouver des régions similaires.

Pourquoi on aligne des protéines ? Ceci permet de retracer l'évolution (phylogénétique en gros) ou encore de trouver des structures similaires, ce qui nous amène à penser qu'elles ont la meme fonction, ou une meme région qui permet qu'elles se fixent ici ou la dans la cellule, trouver des différences entre deux protéines (mutation donc maladie ou évolution... ?) etc. Il y a de nombreuses raison à cela. (NB : on fait pareil avec l'ADN, c'est également une phrase sauf que les composants sont des nucléotides : A, T, C ,G.)

Exemple d'alignement :


Légende :
- Protéines sujettes à l'alignement : MASR, Ssc1, Ssc2, Cig30 (mais peu importe leur nom:colere:)
- Lettres = Acides aminés (mais ça vous l'avez compris maintenant ;-D)
- Zones grises = "match", concordance entre des acides aminés alignés (bref ce sont les mêmes !)
- Zones blances = pas de match (on dit "mismatch")
- Traits horizontaux (-) = "TROUS" crées dans une séquence pour favoriser l'alignement d'autres régions (cfr quote ici en dessous).

TROUS? a dit:
Afin d'améliorer l'alignement, et surtout son score (j'en parle juste après promis), on se permet de créer des trous, aussi appellés "Gaps". Ceci est justifié car au cours du temps, de l'évolution ou à cause de mutations ou dégradations de l'ADN, des régions peuvent etre retirées (on parle alors de délétion), etc. Bref c'est tout à fait possible et justifié, je ne vais pas vous retaper tout mon cours de biologie lol.
Sur quoi se base-t-on pour aligner des séquences ?
=> sur un score.
=> si deux AAs sont les mêmes (il faut regarder de manière verticale), c'est bien, ça match, on va donner un score positif de disons.... +2 !
=> si ce ne sont pas les mêmes AA, on va attribuer une note "mauvaise", faiblement positive, voire meme négative! Il faut regarder si ces 2 AA différents ont par exemple une même affinité pour l'eau, ou si ils sont tous les deux chargés électriquement, etc. Bref le score d'un "mismatch" est proportionnel aux affinités/similarités des 2 AA différents. par exemple -2 ou encore +1 seulement ou même -15 (si ces deux AA sont carrément opposés !)
=> si il y a un trou (ou gap) : c'est pas bien ! (lool), disons -10 !

Ces scores sont répertoriés dans une "Matrice de Score". exemple : BLOSUM62 (BLOck SUbstitution Matrix), ça ressemble à ceci :


L'alignement OPTIMAL de deux séquences est très gourmand car il faut envisager toutes les possibilités, calculer le score de chaque possibilité pour ENFIN sélectionner LA meilleure.

C'est l'algorithme de Smith-Watermann.

Je dois faire ceci pour 6000 protéines de 300 AA chacune, et les aligner toutes entre toutes. Voila :)

(DSL si ça a été un peu long)
 

Groszours

Elite
Bon, alors c'est parti, je vais essayer de simplifier au maximum.^^)

- Une protéine est un polymère d'acides aminés (AAs) qui se suivent les uns derrière les autres, tout comme les lettres se suivent dans une phrase.

- Il existe 20 Acides aminés naturels. Chaque Acide aminé est désigné par une lettre de l'alphabet :





=> Vous voyez donc que finalement on peut réduire une protéine à une phrase. <=

Un alignement de protéine consiste à prendre 2 séquences différentes (on parle d'alignement pair) ou plusieurs (alignement multiple) et à essayer d'aligner au mieux leurs composants (lettres) afin de trouver des régions similaires.
Tu veux faire ça pour la performance de mettre au point ce genre de système en fait ? Pas parce que tu en as réellement besoin ?

Sinon pas besoin de faire simple j'ai eu un cours de bioinformatique sur les alignements de séquences :D
 
1er
OP
Axilatis

Axilatis

Elite
Je veux faire ça car c'est le sujet de mon examen.
Le prof a réussi (ouf) et y est arrivé en utilisant les PC de la classe et les CPU des pc en une grosse heure.

Je veux utiliser CUDA pour y arriver en 30 minutes, voire meme bcp moins selon l'optimisation de l'algorithme pour CUDA et selon les perfs des GPU ^^

NB : j'ai complété l'explication pour ceux que ça intéresse

@ DeflaMental : je suis étudiant en dernière année (BAC +3)
 

gun_shaft

ANDALOUSE MEXICANOS
J'ai un peu travaillé avec CUDA pour mon TFE mais ça restait très très simple comparé à ce que tu veux faire. Mon travail consistait simplement à traiter une vidéo en lui appliquant un filtre de Sobel (détection de contours).

Voici en gros le principe de la programmation CUDA 3.2 (ça date de l'année passée) :
  • Allocation de la mémoire de l'host (CPU)
  • Allocation de la mémoire du device (GPU)
  • Copie des données de l'host vers le device
  • Traitement sur le device
  • Copie des données du device vers l'host

Je veux bien essayer de t'aider si t'as des problèmes mais mes connaissances restent limitées.

edit : je me souviens que lors de mon travail, CUDA ne supportait pas le mutli GPU, il fallait que tu définisses toi même le travail pour chaque GPU
 
1er
OP
Axilatis

Axilatis

Elite
J'ai un peu travaillé avec CUDA pour mon TFE mais ça restait très très simple comparé à ce que tu veux faire. Mon travail consistait simplement à traiter une vidéo en lui appliquant un filtre de Sobel (détection de contours).

Voici en gros le principe de la programmation CUDA 3.2 (ça date de l'année passée) :
  • Allocation de la mémoire de l'host (CPU)
  • Allocation de la mémoire du device (GPU)
  • Copie des données de l'host vers le device
  • Traitement sur le device
  • Copie des données du device vers l'host
Je veux bien essayer de t'aider si t'as des problèmes mais mes connaissances restent limitées.
Merci beaucoup pour ces infos, ça semble pas grand chose mais dans la jungle que représente CUDA sur le net, ça m'éclaire déjà pas mal !
Thx également pour ta proposition d'aide :-D
 

EINST

⭐⭐⭐⭐⭐
Je crois qu'avant de faire le cluster, tu devrais te contenter d'implémenter l'algorithme en CUDA.

Ce sera déjà pas mal ;)
Tu pourras comparer performance CPU vs GPU.


Et ensuite, tu tentes sur FPGA ^^
ou tu compares avec les résultats effectués par ce cluster d'FPGA :
http://www.timelogic.com/
http://www.timelogic.com/catalog/758/decyphersw
http://www.timelogic.com/documents/SeqCruncher_2008.pdf
Smith-Waterman Compared one thousand 49-mers to a small
genome of 119 million symbols in 3.5 minutes (84 billion cells/second) using a 2U DeCypher server (3 SeqCruncher accelerators)
Smith-Waterman, Double Affine Compared 5000 sequences vs
Chromosome 22 in 1 hour, 41 minutes with a 2U DeCypher server
(2 SeqCruncher accelerators)
Je crois que point de vue performance FPGA win mais GPU est plus économique et p-e plus facile à programmer.
 
Haut