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()