PyTorch comment charger un modèle pré-entraîné ?

Il existe plusieurs approches pour enregistrer (sérialiser) et charger (désérialiser) des modèles pour l’inférence dans PyTorch.

Par exemple vous pouvez avoir besoin de charger un modèle qui est déjà entrainé et sauvegarder qui provient d’internet. Plus récemment j’ai répondu à cette question sur un forum de discussion https://discuss.pytorch.org/t/i-want-to-do-machine-learning-with-android/98753. Je profite de cette article pour donner quelques détails.

SAVE ET LOAD D’UN MODE PRE-TRAINED avec load_state_dict

Dans PyTorch on peut sauvegarder un modèle en stockant dans son fichier son state_dict ce sont des dictionnaires Python, ils peuvent être facilement enregistrés, mis à jour, modifiés et restaurés, ajoutant une grande modularité aux modèles et optimiseurs PyTorch.

Dans mon exemple :

ESPNet est sauvegardé avec cette méthode

https://github.com/sacmehta/ESPNet/tree/master/pretrained/encoder

J’ai réussi à charger le modèle de l’encodeur en utilisant la classe ESPNet qui fait un load_state_dict

import torch
model = ESPNet(20,encoderFile="espnet_p_2_q_8.pth", p=2, q=8)
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")

La sortie est

Encoder loaded!

A noter que ESPNet utilise le GPU par défaut et qu’une adaptation dans Model.py dans https://github.com/sacmehta/ESPNet/tree/master/train a été nécessaire en remplaçant :

self.encoder.load_state_dict(torch.load(encoderFile)

Par :

self.encoder.load_state_dict(torch.load(encoderFile,map_location='cpu'))

Sinon si vous ne faites pas cette adaptation n’avez pas la possibilité de lancer sur un GPU vous allez obtenir l’erreur suivante :

RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.
PYTORCH TORCHSCRIPT

SAUVEGARDE ET LOAD PAR PYTORCH SCRIPT

https://pytorch.org/docs/stable/jit.html

TorchScript est un moyen de créer des modèles sérialisables et optimisables à partir du code PyTorch.

Tout programme TorchScript peut être enregistré à partir d’un processus Python et chargé dans un processus où il n’y a pas de dépendance Python.

Le code ci-dessous permet de sauvegarder via l’utilisation de TorchScript le modèle pré-entraîné de ESPNet qui avait été sauvegardé par la méthode classique torch.save.

import torch


model = ESPNet(20,encoderFile="espnet_p_2_q_8.pth", p=2, q=8)
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
#Exemple de save avec TorchScript
torch.jit.save(traced_script_module, "scriptmodel.pth")

Un exemple pour loader via TorchScript ci-dessous :

import torch
model = torch.jit.load("scriptmodel.pth")

RESSOURCES SUR LE SUJET

https://pytorch.org/docs/stable/jit.html

https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html

https://stackoverflow.com/questions/53900396/what-are-torch-scripts-in-pytorch

BCEWithLogitsLoss Pytorch – Python Class

BCEWithLogitsLoss voici quelques explications complémentaire sur l’utilisation de Binary Cross-Entropy Loss avec Pytorch en python.

On m’a demandé récemment comment trouver le code de Binary Cross-Entropy Loss(https://discuss.pytorch.org/t/implementation-of-binary-cross-entropy/98715/2) pour une fonction appelée dans PYTORCH avec la fonction handle_torch_function.

C’est une combinaison de BCELOSS + une couche Sigmoid. C’est plus stable numériquement que l’utilisation d’un Sigmoid suivie d’un BCELoss comme, ici on tire parti de l’astuce log-sum-exp pour la stabilité numérique voir: https://en.wikipedia.org/wiki/LogSumExp

Bcewithlogitsloss : quelques explications

  1. Le code de la classe se trouve dans https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/loss.py
   def forward(self, input: Tensor, target: Tensor) -> Tensor:
        return F.binary_cross_entropy_with_logits(input, target,
                                                  self.weight,
                                                  pos_weight=self.pos_weight,
                                                  reduction=self.reduction)
BCEWithLogitLoss PYTORCH

Le F oject est importé de functionnal.py ici : https://github.com/pytorch/pytorch/blob/master/torch/nn/functional.py

Vous trouverez la fonction appelée

def binary_cross_entropy_with_logits(input, target, weight=None, size_average=None,
                                     reduce=None, reduction='mean', pos_weight=None):

Il appelle le handle_torch_function dans https://github.com/pytorch/pytorch/blob/master/torch/overrides.py
On trouve une entrée de la fonction binary_cross_entropy_with_logits dans le dictionnaire ret qui contiennent toutes les fonctions qui peuvent être overridé dans pytorch. Il s’agit de l’implémentation Python de torch_function plus d’informations dans https://github.com/pytorch/pytorch/issues/24015

Ensuite, le code appelé est dans le C++
Filehttps://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/Loss.cpp

Tensor binary_cross_entropy_with_logits(const Tensor& input, const Tensor& target, const Tensor& weight, const Tensor& pos_weight, int64_t 
...
BCEWithLogitLoss PYTORCH

LIENS DE RESSOURCES :

https://pytorch.org/

Liens internes

http://128mots.com/index.php/category/graphes/

http://128mots.com/index.php/category/python/

Apprendre COBOL – Tutorial pour apprendre le COBOL

Apprendre COBOL, ce tutorial présente les concepts généraux liés à la structure d’un programme en COBOL.

Apprendre COBOL – Introduction

Cette article fait suite à mon introduction au langage COBOL. Je vous conseille de relire la première partie qui traite des principes généraux de COBOL. Ici : http://128mots.com/index.php/2020/10/07/ibm-cobol/ et en anglais http://128mots.com/index.php/en/2020/10/07/ibm-cobol-3/

Nous traitons ici les concepts généraux liés à la structure d’un programme en COBOL.

DATA DIVISION

Toutes les données qui vont être utilisées par le programme sont situées dans la Data Division . C’est l’endroit où toutes les allocations de mémoire requises par le programme sont prises en charge. Cette division est facultative.

GESTION DES FICHIERS :

apprendre cobol

La FILE SECTION décrit les données envoyées ou provenant du système, en particulier les fichiers.

Lorsqu’on apprend COBOL la syntaxe est trèc importante. La syntaxe en COBOL est la suivante

DATA DIVISION.
FILE SECTION.
 FD/SD NameOfFile 
	[RECORD CONTAINS intgr CHARACTERS] 
	[BLOCK CONTAINS intgr RECORDS]
	[DATA RECORD IS NameOfRecord].
	[RECORDING MODE IS {F/V/U/S}]

FD décrit les fichiers et SD les fichiers de tri.

FICHIER EN ENTRÉE

En FILE-CONTROL la déclaration sera :

           SELECT FMASTER      ASSIGN FMASTER
                  FILE STATUS  W-STATUS-FMASTER.

Si le fichier d'entrée est indexée:
           SELECT FMASTER      ASSIGN FMASTER
                  ORGANIZATION IS INDEXED
                  RECORD KEY   IS FMASTER-KEY
                  FILE STATUS  W-STATUS-FMASTER..

Dans ce cas au niveau de la FILE-SECTION on va avoir :

      *    FMAITRE en entrée  
       FD  FMAITRE.
       01  ENR-FMAITRE.
      *    Déclarations des zones de l’enregistrement

Au niveau JCL la déclaration sera de la forme :
//ENTREE    DD DSN=SAMPLE.INPUTF,DISP=SHR
IBM COBOL TRAINING FREE apprendre cobol

FICHIER EN SORTIE

La déclaration JCL sera alors :

//OUTFILE   DD DSN=SAMPLE.OUTPUTF,DISP=(,CATLG,DELETE),
//       LRECL=150,RECFM=FB

RECFM spécifie les caractéristiques des enregistrements avec longueur fixe (F), longueur variable (V), longueur variable ASCII (D) ou longueur indéfinie (U). Les enregistrements qui sont dit bloqués sont décrits comme FB, VB ou DB.

OUVERTURE ET FERMETURE FICHIER EN PROCEDURE DIVISION

COBOL utilise des mécanismes en PROCEDURE DIVISION pour effectuer des lecture écriture, fermeture et ouverture de fichier.

Ouverture de fichier d’entrée :

OPEN  INPUT               FICENT

Ouverture de fichier de sortie :

OPEN OUTPUT          FICSOR

Fermeture de fichier :

CLOSE FICENT
CLOSE FICSOR

Lecture de fichier:

READ ACTENR
AT END MOVE 'O' TO DERNIER-ENREGISTREMENT
END-READ

Ecriture fichier

WRITE SOR-ENR
IBM COBOL TRAINING FREE apprendre cobol

Apprendre COBOL – LIENS EXTERNES VERS DES RESSOURCES

Ci-dessous quelques liens que j’ai trouvé intéressants qui traitent également de la gestion des fichiers avec COBOL.

Exemple de gestion de fichier du site IBM : https://www.ibm.com/support/knowledgecenter/en/SS6SGM_5.1.0/com.ibm.cobol51.aix.doc/PGandLR/ref/rpfio13e.html

REFM Format : https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/com.ibm.zos.v2r2.idad400/d4037.htm

Tutorialspoint un article sur la gestion fichier https://www.tutorialspoint.com/cobol/cobol_file_handling.htm

COURSERA COBOL with VSCODE : https://www.coursera.org/lecture/cobol-programming-vscode/file-handling-YVlcf

MEDIUM un article intéressant pour les débutants COBOL : https://medium.com/@yvanscher/7-cobol-examples-with-explanations-ae1784b4d576

Egalement sur son blog : http://yvanscher.com/2018-08-01_7-cobol-examples-with-explanations–ae1784b4d576.html

Beaucoup d’exemple COBOL de tutoriaux et sample code gratuits : http://www.csis.ul.ie/cobol/examples/default.htm

GITHUB Awesome-cobol vous https://github.com/mickaelandrieu/awesome-cobol

Apprendre COBOL – LIENS INTERNES

IBM COBOL FREE TRAINING

Apprendre le COBOL – Tutorial pour apprendre COBOL

Apprendre COBOL est un ensemble de connaissances très intéressants. COBOL (COmmon Business Oriented Language) est un langage orienté métier il est très adapté pour le traitement de données avec des hautes performances et précisions, il est proposé par IBM.

Introduction – Apprendre le COBOL

Vous pouvez être sur que tous les achats ou retraits que vous faites avec votre carte bancaire démarre un programme en COBOL. Chaque jours COBOL traite des millions de transactions. De mon point de vue apprendre COBOL est un ensemble de connaissances très intéressants.

J’ai travaillé plus de 10 ans avec ce langage et je partage ici quelques notes qui vous permettrons sans doute de vous faire la main avec.

Le mainframe se modernise avec la possibilité de programmer avec les derniers outils tels que l’éditeur de code libre VsCode etson extension Zowe ainsi que Z Open editor, de s’exécuter dans le cloud dans des environnement tels que Open Shift et d’intégrer les principes devops avec des outils tels que Github, jenkins, Wazi.

Syntaxe COBOL

La syntaxe de COBOL est assez simple et se rapproche du langage naturel en anglais.

Le code est standardisé selon des colonnes qui permettent de décrire 5 zones clés.

Séquence Area : specifie un numéro de sequence de la ligne de code parfois, parfois à blanc

Indicator Area : peut contenir un indicateur par exemple * pour indiquer que la ligne est un commentaire, D pour indiquer que la ligne s’exécute uniquement en debugging mode.

A AREA : Contient les divisions, sections, paragraphes et Levée

B AREA : Sentences et statements du programme cobol for exemple COMPUTE quelques chose…

Identification Area: espace à ignorer et laisser à blanc.

Il y a egalement des mots réservés en COBOL vous trouverez sur le lien la liste des mots réservés en COBOL. https://www.ibm.com/support/knowledgecenter/SSZJPZ_9.1.0/com.ibm.swg.im.iis.ds.mfjob.dev.doc/topics/r_dmnjbref_COBOL_Reserved_Words.html

DIVISIONS :

Le code est structuré par des divisions qui contiennent des Sections composées de Paragraphe eux même constitués par des Sentences et Statements.

Exemple de sentences :

ADD 45 TO PRICE.

A noter que le point corresponds à un terminateur implicite de portée.

Il y a 4 Divisions dans un programmes en COBOL :

– DATA DIVISION : permets de mettre en place la gestion des donnee qui vont être traitees par le programme.

– IDENTIFICATION DIVISION : Nom programme et du du programmeur, date du programme, but du programme.

– ENVIRONEMENT DIVISION : Type d’ordinateur utilise et mapping entre les fichiers utilisé dans le programmes et les dataset sur le système (lien entre le programme et le système)

– PROCEDURE DIVISION : C’est ici qu’est contenu le code métier composé des différents paragraphes à exécuter.

Les variables en Cobol :

Comme dans les autres langages des lettres permettent de représenter des valeurs stockées en mémoire.

Le nom d’une variable est de maximum 30 caractères.

Une clause Picture permet de fixer le type de la variable.

PIC 9 : Numérique la longueur est entre parenthèse.

PIC 9(5) : variable numérique de 5 digits la longueur maximale pour un numérique est 18.

PIC A pour un caractère

PIC X(11) : un alphanumérique avec une longueur maximum de 255

Il est possible d’avoir des types édité au moyen de symboles :

PIC 9(6)V99 pour un numerique de 6 digits et 2 décimales séparés par virgule.

PIC $9,999V99 pour représenter un montant

A noter que COBOL mets à dispositions des literaux constant tels que ZEROES, SPACE, SPACES, LOW-VALUE …

Plus d’information sur ce lien :

https://www.ibm.com/support/knowledgecenter/SS6SG3_4.2.0/com.ibm.entcobol.doc_4.2/PGandLR/ref/rllancon.htm

Si vous débutez sur IBM COBOL et que vous souhaitez faire un apprentissage sérieux et pas trop cher, je vous conseille absolument de lire ce livre :

Ce livre couvre beaucoup de sujet concernant le langage machine, IBM Cobol training, Open Cobol IDE, DB2 pour devenir un véritable Cobol programmers.

Voir aussi mes articles :

Liens internes Apprendre le COBOL

http://128mots.com/index.php/category/python/

Comment j’ai préparé la certification PRINCE2® Practitioner ?

Je viens tout juste d’obtenir la certification PRINCE2® Practitionner. 

PRINCE2® est une méthodologie de gestion de projet utilisée à travers le monde qui peut s’adapter à tous les types de projet.

Avec un salaire moyen de 84 450 $ pour un chef de projet certifié, (ici), je dois dire que PRINCE2® est  de mon point de vue un ensemble de compétences très intéressant à obtenir.

Apprendre PRINCE2® c’est un peu comme dire « Je veux travailler avec la meilleure méthode pour gérer et contrôler des projets avec un rayon d’action international. »

Je vous partage ici quelques notes et mon retour d’expérience ainsi que des ressources, qui pourrait vous intéressez si vous envisagez de vous certifier PRINCE2®.

La première étape de la certification est l’examen PRINCE2® Fondamental (PRINCE2® Foundation en anglais) qui valide que vous avez les connaissances pour participer à un projet qui utilise la méthode PRINCE2®
L’examen PRINCE2® Praticien (PRINCE2® Practitioner en anglais) vise une maitrise parfaite de la méthode pour manager et gérer un projet, l’examen Fondamental est un pré-requis.

Je vous conseille absolument de lire le livre officiel Managing Successful Projects with PRINCE2®

Disponible ici :

et vous y avez droit pendant l’examen PRINCE2® Practitioner.
Vous pouvez choisir de passer la certification en Français ou en anglais. Je vous conseille de la passer en anglais car selon moi cela confère un caractère plus internationnal à la certification. Aussi vous disposerez de 30 minutes supplémentaires à l’examen si vous ne le passez pas dans votre langue maternelle.

Voici une liste de ressource intéressante que j’ai pu trouver en ligne :

https://prince2.wiki : Des supports gratuits pour vous aider à passer les certifications PRINCE2® .

Simulateur d’examen en ligne gratuit pour PRINCE2® Foundation https://mplaza.training/exam-simulators/prince2-foundation/

Simulateur d’examen en ligne gratuit pour PRINCE2® Practitioner https://mplaza.training/exam-simulators/prince2-practitioner/

Le site officiel PRINCE2®de Axelos : https://www.axelos.com/best-practice-solutions/prince2

Si vous recherchez un livre en français je vous conseille celui-ci :

Intellectual Property :
PRINCE2® and PRINCE2 Agile® are registered trade marks of AXELOS Limited, used under permission of AXELOS Limited. All rights reserved.