Guide de gestion d'infrastructure Linux et de traitement d'images médicales pour le Deep Learning

Optimisation et monitoring des ressourcse GPU sous Linux

La surveillance des ressources matérielles est cruciale lors de l'entraînement de modèles lourds. Pour identifier précisément les identifiants uniques des processeurs graphiques installés, la commande suivante est utilisée :

nvidia-smi -L

Pour un suivi en temps réel de la charge de travail et de la mémoire consommée, il est recommandé d'utiliser une fréquence de rafraîchissement d'une seconde :

nvidia-smi -l 1

Concernant la gestion des fichiers, l'inspection des droits d'accès s'effectue via ls -l, permettant de vérifier les propriétaires et les permissions de lecture/écriture sur les dossiers de données.

Persistance des processus sur serveur distant

Lors de l'exécution de scripts de longue durée sur un serveur distant, il est impératif d'utiliser un multiplexeur de terminaux (comme Screen ou Tmux). Cela garantit que le processus ne soit pas interrompu en cas de déconnexion de la session SSH locale.

Configuration d'environnements Conda et installation de dépendances

La mise en place d'un environnement reproductible pour la vision par ordinateur suit généralement ce schéma :

# Création d'un environnement spécifique
conda create -n vision_env python=3.10 -y

# Installation de PyTorch avec support CUDA 11.6
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116

# Mise à jour des bibliothèques tierces
pip install -U package_name

Si une bibliothèque n'est pas disponible sur les dépôts officiels (PyPI ou Conda), l'installation peut être réalisée directement depuis les sources Git :

git clone [URL_DU_DEPOT]
cd [NOM_DU_PROJET]
conda activate vision_env
python setup.py install

Développement Python : Interface CLI et manipulation de fichiers

Pour rendre les scripts de traitement flexibles, l'utilisation de argparse est la norme pour gérer les paramètres d'entrée :

import argparse

def get_config():
    cfg = argparse.ArgumentParser(description="Paramètres de traitement d'images")
    cfg.add_argument('--src', type=str, default='/data/input', help='Dossier source')
    cfg.add_argument('--dest', type=str, default='/data/output', help='Dossier de destination')
    cfg.add_argument('--report', type=str, default='./log.json', help='Fichier de log')
    return cfg.parse_args()

params = get_config()
input_path = params.src

Pour le tri de fichiers dont le nom contient des indices numériques (ex: img_10.png), une fonction de tri naturel évite les erreurs de classement alphabétique :

import os

# Tri basé sur l'indice numérique extrait du nom de fichier
files = [f for f in os.listdir(base_dir) if f.endswith('.png')]
files.sort(key=lambda name: int(name.split('_')[1]))

Prétraitement d'imagerie CT : Fenêtrage et Normalisation

En imagerie médicale, les fichiers DICOM bruts contiennent souvent des valeurs de pixels brutes, tandis que le format NIfTI (.nii) stocke généralement les valeurs en unités Hounsfield (HU). Le réglage de la "fenêtre" (Window Width et Window Center) est indispensable pour isoler les tisssus d'intérêt.

Voici une implémentation pour normaliser les volumes NIfTI en fonction des paramètres de fenêtrage :

import nibabel as nib
import numpy as np

def apply_ct_window(input_path, output_path, ww, wc):
    """
    Applique un fenêtrage CT et normalise entre 0 et 1.
    ww : Window Width
    wc : Window Center (Level)
    """
    img_nii = nib.load(input_path)
    data = img_nii.get_fdata()

    # Calcul des bornes
    lower_bound = wc - (ww / 2.0)
    upper_bound = wc + (ww / 2.0)

    # Tronquage et normalisation linéaire
    rescaled_data = np.clip(data, lower_bound, upper_bound)
    rescaled_data = (rescaled_data - lower_bound) / (upper_bound - lower_bound)

    # Sauvegarde du nouveau volume
    out_img = nib.Nifti1Image(rescaled_data.astype(np.float32), img_nii.affine)
    nib.save(out_img, output_path)

Visualisation rapide de volumes 3D

Pour inspecter rapidement un volume .nii directement en Python, l'outil OrthoSlicer3D de la bibliothèque Nibabel permet une navigation orthogonale simple :

from nibabel.viewers import OrthoSlicer3D
import nibabel as nib

# Chargement et affichage
volume = nib.load('scan_ct.nii.gz').get_fdata()
OrthoSlicer3D(volume).show()

Étiquettes: Linux nvidia-smi conda PyTorch Python

Publié le 10 juillet à 02h33