IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

utiliser une ia local avec locallm


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut utiliser une ia local avec locallm
    Bonjour
    Je cherche a utiliser la bibliothèque pip locallm
    Et même si cela fonctionne les messages semblent inexploitables

    Voici un exemple utilisant pip locallm

    Préambule , créer un environnement virtuelle

    Python -m venu monlocallm
    Puis installation de pip install locallm dans l environnement virtuelle

    J import le ou les modèles dans le sous répertoire modele de cet environnement

    Et je test le code exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Déclaration d'une instance de LocalLm
    lm = LocalLm(
        LmParams(
            models_dir=r"C:\Env_py\ialocal_lm\models", 
            is_verbose=False,
        )
    )
     
    # Chargement du modèle en mémoire 
     
    lm.load_model("mistral-7b-instruct-v0.1.Q4_K_M.gguf", 8192)
    template = "<s>[INST] {prompt} [/INST]"
    lm.infer(
        "list the planets in the solar system",
        InferenceParams(
            template=template,
            temperature=0.2,
            stream=True,
            max_tokens=512,
        ),
    )
    Et la j'ai droit a une flopée d informations de fonctionnement du modèle et aussi a la réponses perdu au travers aussi d informations aberrantes.

    Du fait du paramètre stream=True, le texte s'affichera dans le terminal au fur et à mesure de son émission par le modèle. Le prompt template utilisé dépend du modèle : ici le format Mistral convient très bien.

    voici ce que j'ai obtenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Running inference with prompt:
    <s>[INST] list the planets in the solar system [/INST]
    Inference parameters:
    {'stream': True, 'max_tokens': 512, 'temperature': 0.2}
    T  Sure
     SureT ,
    ,T  here
     hereT  is
     isT  a
     aT  list
     listT  of
     ofT  the
     theT  planets
     planetsT  in
     inT  our
     ourT  solar
     solarT  system
     systemT :
    :T 
     
     
    T 1
    1T .
    .T  Mer
     MerT cury
    curyT 
     
     
    T 2
    2T .
    .T  Ven
     VenT us
    usT 
     
     
    T 3
    3T .
    .T  Earth
     EarthT 
     
     
    T 4
    4T .
    .T  Mars
     MarsT 
     
     
    T 5
    5T .
    .T  J
     JT upiter
    upiterT 
     
     
    T 6
    6T .
    .T  Sat
     SatT urn
    urnT 
     
     
    T 7
    7T .
    .T  U
     UT ran
    ranT us
    usT 
     
     
    T 8
    8T .
    .T  Ne
     NeT pt
    ptT une
    une
    Franchement etrange

    Du fait du paramètre stream=True, le texte s'affichera dans le terminal au fur et à mesure de son émission par le modèle. Le prompt template utilisé dépend du modèle : ici le format Mistral convient très bien.... Gag avec stream = False aussi...

    is_verbose bool: booléen permet de jouer sur cette information et il est a false...

    Mon but est de récupérer les données produites par le modèle, mais je ne vois pas comment ?


    PS pas de tag visible avec une tablette..... Donc le code est au milieu de message désolée

  2. #2
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Voici le code avec des choses possiblement inutiles

    il utilise
    locallm pour le moteur de traduction
    nltk pour la gestion de texte accés ici sur de l'anglais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pip install locallm  
    pip install nltk 
     
    # on charge les modèles NLTK
    import nltk
    nltk.download()
    Le modèle mistral-7b-instruct-v0.1.Q4_K_M.gguf pour la traduction il doit y avoir mieux ou plus rapide... si vous avez des idées d'optimisation je suis intéressé:
    comme par exemple utiliser les gpu de la carte nvidia adapté pour les IA


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    import tkinter as tk
    from tkinter import filedialog , messagebox
    from locallm import InferenceParams, LmParams, LocalLm
    import PyPDF2
    from PyPDF2 import PdfReader  # Importation de PdfReader
     
    # modele d'analyse de text
    import re
    import nltk
     
    from nltk.tokenize import word_tokenize
    from nltk.corpus import stopwords
    from nltk.stem import SnowballStemmer
    from nltk.tokenize import sent_tokenize
    import os
     
    nom_fichier_origine =None
    nom_repertoire_origine =None
     
    nltk.data.path.append(r"C:\environnement_python\models-ia\nltk_data")
    models_dir=r"C:\environnement_python\models-ia"
     
    # Déclaration d'une instance de LocalLm
    lm = LocalLm(
        LmParams(
            models_dir=models_dir, 
            threads =get_num_threads,
            is_verbose=True,
        )
    )
     
    lm.load_model("mistral-7b-instruct-v0.1.Q4_K_M.gguf", 8192)
     
     
     
    def get_num_threads():
        """Obtient le nombre de threads sur le système."""
        try:
            num_threads = os.cpu_count()  # Récupère le nombre de processeurs logiques
            if num_threads is not None:
                return  int(num_threads * 0.8)
            else:
                messagebox.showerror("Problème  pc", "Impossible de récupérer le nombre de threads.")
                return None
        except NotImplementedError:
                messagebox.showerror("Problème  pc", "Impossible de récupérer le nombre de threads.")
                return None
     
     
    # Fonction pour traduire un texte
    def traduire(Le_texte):
        template = "<s>[INST] Traduite d'anglais en français[ le text {prompt} /INST]"
     
        result = lm.infer(
            Le_texte,
            InferenceParams(
                template=template,
                temperature=0.2,
                stream=False,
                max_tokens=8192,
            ),
        )
     
        result_text = result['text']
        return result_text
     
     
    def analyse_de_text_v(text):
     
        # Tokenization : Diviser un texte en mots, phrases ou autres éléments linguistiques plus petits.
        # Stopwords : Fournit une liste de mots courants qui sont souvent considérés comme non informatifs et qui peuvent être omis lors de l'analyse de texte.
        # Stemming : Réduire les mots à leur forme de base en supprimant les affixes. Par exemple, "running" devient "run".
        # Lemmatization : Réduire les mots à leur forme de base en utilisant des règles linguistiques et en tenant compte du contexte. Par exemple, "running" deviendrait "run".
        # Part-of-speech (POS) tagging : Assigner des parties du discours à chaque mot dans un texte.
        # Analyse syntaxique : Analyser la structure grammaticale des phrases dans un texte.
        # WordNet : Une base de données lexicale comprenant des mots groupés par synonymes et organisés en concepts.
     
        # Supprimer les blocs de caractères inutiles
     
     
        # Tokenization : Diviser un texte en mots, phrases ou autres éléments linguistiques plus petits.
        words = word_tokenize(text)
     
        # Suppression des stopwords et application du stemming tout en préservant la casse originale
        stemmer = SnowballStemmer('english')
        processed_words = []
        for word in words:
            if word.lower() not in stopwords.words('english'): # Vérification du mot en minuscule pour les stopwords
                processed_words.append(stemmer.stem(word)) # Application du stemming au mot d'origine
            else:
                processed_words.append(word) # Ajout du mot tel quel s'il est dans les stopwords
     
        # Reconstruction du texte
        processed_text = ' '.join(processed_words)
     
        return processed_text
     
     
    def analyse_de_text(text):
        text = re.sub(r'\.{4,}', '', text)
        text = re.sub(r'(\S+)\n(\S+)', r'\1 \2', text)
        text = re.sub(r'(\S+)\-\n(\S+)', r'\1\2', text)  # Supprimer les retours à la ligne entre les mots
     
        return text
     
    # Fonction pour extraire le texte d'un fichier PDF
    def extract_text_from_pdf(pdf_file_path):
        global nom_repertoire_origine, nom_fichier_origine 
     
        status_label.config(text="Traitement en cours convertion pdf en texte... Veuillez patienter.")
               # Obtenir le nom du fichier d'origine sans l'extension
        nom_fichier_origine = os.path.splitext(os.path.basename(pdf_file_path))[0]
            # Obtenir le nom du répertoire et le nom du fichier d'origine sans l'extension
        nom_repertoire_origine = os.path.dirname(pdf_file_path)
     
           # Nom du fichier de sortie avec le nom du répertoire et "_V1.txt" ajouté à la fin
        fichier_sortie = os.path.join(nom_repertoire_origine, f"{nom_fichier_origine}_V1.txt")
     
        text = ""
        with open(pdf_file_path, 'rb') as file:
            reader = PdfReader(file)
            num_pages = len(reader.pages)
            for page_number in range(num_pages):
                page = reader.pages[page_number]
                text += page.extract_text()
                # Supprimer les blocs de caractères inutiles
                text =analyse_de_text(text)
     
                with open(fichier_sortie, "w", encoding="utf-8") as file:
                    file.write(text)   
        return text
     
    def traduire_et_sauvegarder_tk(pdf_file_path):
        global nom_repertoire_origine, nom_fichier_origine
     
        # Afficher un message de traitement en cours dans la fenêtre principale
        status_label.config(text="Traitement traduction en cours ... Veuillez patienter.")
     
        # Extraire le texte du PDF
        texte_pdf = extract_text_from_pdf(pdf_file_path)
     
        # Chemin du fichier de sortie
        fichier_sortie = os.path.join(nom_repertoire_origine, f"{nom_fichier_origine}_fr.txt")
     
        # Découper le texte en blocs de tokens de taille appropriée
        taille_max_bloc = 8192
        blocs_de_tokens = [texte_pdf[i:i+taille_max_bloc] for i in range(0, len(texte_pdf), taille_max_bloc)]
     
        # Ouvrir le fichier de sortie une seule fois pour toutes les opérations d'écriture
        with open(fichier_sortie, "w", encoding="utf-8") as file:
            for bloc in blocs_de_tokens:
                # Traduire le bloc de texte actuel
                bloc_traduit = traduire(bloc)
                # Écrire le texte traduit dans le fichier de sortie
                file.write(bloc_traduit)
     
        # Indiquer que le traitement est terminé
        status_label.config(text="Traitement terminé.")
     
     
     
    def traduire_et_sauvegarder(pdf_file_path):
        global nom_repertoire_origine, nom_fichier_origine
     
        # Afficher un message de traitement en cours dans la fenêtre principale
        status_label.config(text="Traitement traduction en cours ... Veuillez patienter.")
     
        # Extraire le texte du PDF
        texte_pdf = extract_text_from_pdf(pdf_file_path)
     
        # Chemin du fichier de sortie
        fichier_sortie = os.path.join(nom_repertoire_origine, f"{nom_fichier_origine}_fr.txt")
     
        # Découper le texte en phrases avec NLTK
        phrases = sent_tokenize(texte_pdf)
     
        # Concaténer les phrases par blocs de 10
        blocs_de_phrases = [' '.join(phrases[i:i+10]) for i in range(0, len(phrases), 10)]
     
        # Ouvrir le fichier de sortie une seule fois pour toutes les opérations d'écriture
        with open(fichier_sortie, "w", encoding="utf-8") as file:
            for bloc in blocs_de_phrases:
                # Traduire le bloc de phrases
                bloc_traduit = traduire(bloc)
                # Écrire le bloc traduit dans le fichier de sortie
                file.write(bloc_traduit + "\n\n")
     
        # Indiquer que le traitement est terminé
        status_label.config(text="Traitement terminé.")
     
     
     
    # Fonction pour gérer le bouton "Choisir PDF"
    def choisir_pdf():
        filepath = filedialog.askopenfilename(filetypes=[("PDF files", "*.pdf")])
        if filepath:
            traduire_et_sauvegarder(filepath)
     
    def about():
        messagebox.showinfo("About", "Cette application prend en charge le fichier PDF")
     
    def quit_app(root):
        if messagebox.askokcancel("Quitter", "Etes vous sure de vouloir fermer l'application?"):
            root.destroy()
     
     
    def main():
        root = tk.Tk()
        root.title('CSV File Reader/Writer')
        root.geometry('500x500')
     
        # Créer une étiquette pour afficher le statut du traitement
        global status_label
        status_label = tk.Label(root, text="", bd=1, relief=tk.SUNKEN, anchor=tk.W)
        status_label.pack(side=tk.BOTTOM, fill=tk.X)
     
        # Menu bar
        menubar = tk.Menu(root)
        root.config(menu=menubar)
     
        file_menu = tk.Menu(menubar, tearoff=0)
        file_menu.add_command(label="Choisir PDF", command=choisir_pdf)
        file_menu.add_separator()
        file_menu.add_command(label="Quit", command=lambda: quit_app(root))
        menubar.add_cascade(label="File", menu=file_menu)
     
        # About menu
        about_menu = tk.Menu(menubar, tearoff=0)
        about_menu.add_command(label="About", command=about)
        menubar.add_cascade(label="About", menu=about_menu)
     
     
        # Lancement de la boucle principale de Tkinter
        root.mainloop()
     
     
     
    if __name__ == "__main__":
        main()
    J'ai quelques effet des plus étranges comme ceci

    "... Sinon, l'arbre peut créer des tempêtes des millénaires pour des périodes courtes de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de temps de .... de tens de tens of thousands of years old."

    parfois l'apparition de la phrase "Traduit de l'anglais au français : ou même Translation from English to French:"

    Des partie de texte non traduite debutant par "
    Translate from English to French:

    Detect poison by smell and taste. Most plant toxins have a distinctive odor that the herbalist recognizes immediately. ..."

    Le document d’origine n'est pas exsangue de tout défaut ...



    Voici par exemple le bloc qui appelle le modèle de traduction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    # Fonction pour traduire un texte
    def traduire(Le_texte):
        template = "<s>[INST] Traduite d'anglais en français[ le text {prompt} /INST]"
     
        result = lm.infer(
            Le_texte,
            InferenceParams(
                template=template,
                temperature=0.2,
                stream=False,
                max_tokens=8192,
            ),
        )
     
        result_text = result['text']
        return result_text

Discussions similaires

  1. Utiliser une DLL Delphi avec C#
    Par h8ciz dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/09/2007, 16h46
  2. Utiliser une image DirectX avec GDI?
    Par Fynchi dans le forum DirectX
    Réponses: 11
    Dernier message: 02/11/2006, 09h36
  3. lancer une URL local avec des espaces dedans
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 05/09/2006, 21h26
  4. [WD10] Utiliser une fonction OpenGL avec pointeur (int)
    Par Zoons dans le forum WinDev
    Réponses: 3
    Dernier message: 06/07/2006, 16h38
  5. utiliser une expression régulliere avec la methode getelementbyid
    Par rootdaoud dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/05/2006, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo