Optimisation de l’Espace Disque Windows pour PyTorch avec des Hard Links et Venv


Dans le domaine en rapide évolution de l’intelligence artificielle (IA) et de l’apprentissage automatique, la gestion efficace des ressources système est cruciale. Une des bibliothèques les plus puissantes et les plus utilisées pour l’IA, PyTorch, est également connue pour sa taille conséquente lorsqu’elle est installée de multiple fois à travers les environnements virtuels, surtout quand elle est accompagnée de CUDA pour l’accélération GPU. Dans ce contexte, nous avons entrepris une aventure d’optimisation avec venv qui nous a permis d’économiser des dizaine de gigaoctets, voire cent gigaoctet, d’espace disque. Voici comment.

Le Défi

Avec plusieurs environnements virtuels nécessitant chacun leur propre installation de PyTorch, l’espace disque requis peut rapidement devenir conséquent. Notre objectif était de trouver un moyen de partager efficacement une seule installation de PyTorch à travers plusieurs environnements virtuels sans dupliquer les fichiers, réduisant ainsi l’utilisation de l’espace disque.

La Stratégie : les hardlinks sous Windows

La solution a émergé à travers l’utilisation de hard links, un concept de système de fichiers qui permet à plusieurs chemins de fichier de pointer vers le même ensemble de données sur le disque. En appliquant ce principe, nous avons pu créer des références aux fichiers de PyTorch dans de nouveaux environnements virtuels (venv) sans ajouter à l’espace disque utilisé.

Avertissement Important : Manipulation avec Précaution

Cette stratégie nécessite une manipulation et une maintenance attentives.

Les hard links créent un lien direct entre les fichiers dans différents environnements virtuels et l’emplacement de stockage des données originales. Cela signifie que toute modification, suppression ou mise à jour effectuée sur le fichier d’origine affectera tous les liens associés. Les utilisateurs doivent être pleinement conscients de ces interdépendances avant de choisir d’utiliser des hard links.

Étant donné que les fichiers sont partagés entre plusieurs environnements, la maintenance traditionnelle à base de mises à jour incrémentielles peut ne pas être appropriée. Les hard links ne permettent pas de mettre à jour un fichier dans un seul environnement sans affecter les autres. Par conséquent, une réinstallation complète de la bibliothèque ou du module concerné est recommandée lors de chaque mise à jour majeure pour garantir la cohérence et le bon fonctionnement de tous les environnements.

Avant d’effectuer une mise à jour de PyTorch ou de toute autre bibliothèque utilisée à travers des hard links, il est essentiel de supprimer les liens existants et de recréer les environnements virtuels pour éviter des conflits ou des dysfonctionnements. Cette étape garantit que chaque environnement utilise la version la plus à jour et stable des bibliothèques nécessaires, sans hériter de problèmes potentiels dus à des versions antérieures.

Étapes de réalisation :

Installation de Base et Préparation pour l’Utilisation des Hard Links

Commençons par une étape cruciale : la création d’un environnement virtuel dédié spécifiquement à l’installation de la bibliothèque PyTorch. Cette installation en dur dans un environnement virtuel a été conçue pour servir de référence centrale, à partir de laquelle PyTorch serait partagé avec d’autres environnements virtuels destinés à des applications d’intelligence artificielle variées. L’objectif était de garantir que toutes ces applications puissent bénéficier de PyTorch sans nécessiter de multiples installations indépendantes.

Création d’un Environnement Virtuel de Référence

Pour identifier précisément les fichiers et les répertoires associés à PyTorch et requis pour son fonctionnement, il était indispensable de disposer d’un point de comparaison. Cela a mené à la création d’un environnement virtuel vierge, dépourvu de toute installation supplémentaire. Ce dernier allait nous permettre de détecter les modifications spécifiques apportées par l’installation de PyTorch, en distinguant clairement les éléments propres à cette bibliothèque de ceux inhérents à un environnement Python standard.

L’enjeu était de comprendre avec précision quels chemins d’accès étaient exclusivement liés à PyTorch. Cette compréhension allait ensuite guider l’utilisation efficace des hard links pour partager PyTorch entre différents projets d’IA, en évitant la duplication de données et en optimisant l’utilisation de l’espace disque.

Mise en Œuvre du Script de Comparaison Python

Une fois les environnements préparés, l’étape suivante consistait à établir précisément quels fichiers et répertoires étaient ajoutés ou modifiés par l’installation de PyTorch, par rapport à un environnement Python vierge. Pour cela, nous avons développé et utilisé un script de comparaison en Python.

import os

def list_directory_contents(path):
    """Retourne une liste des chemins de fichiers relatifs à partir d'un chemin de dossier."""
    contents = []
    for root, dirs, files in os.walk(path):
        for name in files:
            contents.append(os.path.relpath(os.path.join(root, name), path))
        for name in dirs:
            contents.append(os.path.relpath(os.path.join(root, name), path))
    return set(contents)

def compare_directories(source, target):
    """Compare les contenus de deux dossiers et affiche les éléments manquants dans le dossier cible."""
    source_contents = list_directory_contents(source)
    target_contents = list_directory_contents(target)

    missing = source_contents - target_contents
    if missing:
        print("Éléments présents dans le source mais absents dans le cible:")
        for item in sorted(missing):
            print(item)
    else:
        print("Les deux dossiers ont les mêmes contenus.")

if __name__ == "__main__":
    source_path = input("Entrez le chemin du dossier source (avec `requests` installé): ")
    target_path = input("Entrez le chemin du dossier cible (vierge): ")

    compare_directories(source_path, target_path)

Ce script a été conçu pour analyser et comparer les contenus des dossiers site-packages des environnements virtuels. Voici comment il fonctionne :

Commande exemple :

python compare.py > compare.txt
(chemin absolue vers le dossier venv-pytorch/Lib/site-package)
(chemin absolue vers le dossier venv-vierge/Lib/site-package)

Le fichier généré est très important pour la suite.

Création d’un Environnement Virtuel pour l’IA et Copie des Hard Links de PyTorch

Armés de la liste précieuse des répertoires et fichiers PyTorch à partager, identifiée par notre script de comparaison, la prochaine étape nous amène à la préparation concrète de l’environnement d’exécution pour notre application d’intelligence artificielle (IA).

Installation du Programme IA via Git

Pour installer notre application IA, nous avons opté pour une approche qui nous permet de garder le contrôle total sur les dépendances :

Intégration des Hard Links pour PyTorch

import os

def ensure_dir_exists(path):
    """Assure que le répertoire spécifié existe, le crée si ce n'est pas le cas."""
    os.makedirs(path, exist_ok=True)

def create_hardlink(source, link_name):
    """Crée un hard link pour le fichier spécifié."""
    try:
        os.link(source, link_name)
        print(f"Hard link créé pour {link_name}")
    except OSError as error:
        print(f"Erreur lors de la création du hard link pour {link_name}: {error}")

def process_paths(file_path, source_root, target_root):
    """Traite chaque chemin dans le fichier pour créer des hard links dans la destination."""
    with open(file_path, 'r') as file:
        for line in file:
            relative_path = line.strip()
            source_path = os.path.join(source_root, relative_path)
            target_path = os.path.join(target_root, relative_path)

            if os.path.isdir(source_path):
                ensure_dir_exists(target_path)
            elif os.path.isfile(source_path):
                target_dir = os.path.dirname(target_path)
                ensure_dir_exists(target_dir)  # S'assurer que le répertoire cible existe
                create_hardlink(source_path, target_path)

if __name__ == "__main__":
    file_path = input("Entrez le chemin du fichier listant les chemins à créer : ")
    source_root = input("Entrez le chemin racine du dossier source : ")
    target_root = input("Entrez le chemin racine du dossier cible : ")

    process_paths(file_path, source_root, target_root)

Commande exemple

python copy-hardlinks.py
(chemin absolue vers le fichier compare.txt)
(chemin absolue vers le dossier venv-pytorch/Lib/site-package)
(chemin absolue vers le dossier venv-vierge/Lib/site-package)

Cette command permettra de copier tous les harklinks et donc tout les fichiers nécessaires à l’utilisation de pytorch. il recréera aussi les dossiers manquants.

Installation des Dépendances Restantes

Une fois les hard links de PyTorch en place, le fichier requirements.txt de l’application IA est utilisé pour installer toutes les autres dépendances nécessaires. Puisque les composants essentiels de PyTorch sont déjà référencés via des hard links, PyTorch lui-même n’est pas réinstallé, ce qui préserve l’optimisation de l’espace disque réalisée.

Avantages de cette Méthode

Cette approche nous permet non seulement de maintenir l’intégrité et la performance de notre environnement PyTorch mais aussi de réaliser des économies d’espace disque significatives. Au lieu de consommer plusieurs gigaoctets supplémentaires pour chaque nouvelle installation d’IA, l’espace requis reste marginal, limité aux dépendances uniques de chaque projet IA.

Le Résultat

Grâce à cette approche, nous avons réussi à réduire significativement l’espace disque nécessaire pour les projets d’IA utilisant PyTorch, sans compromettre la performance ou la fonctionnalité. L’installation de dépendances supplémentaires via un fichier requirements.txt a permis d’assurer que les environnements virtuels disposaient de tout le nécessaire, tout en évitant les redondances.