# pb débutant avec python



## xorian (16 Juin 2020)

Bonjour,
Je ne suis pas du tout programmeur mais je désire essayer python et plus spécialement la génération de texte en intelligence artificielle via GPT-2.
Je me suis donc référé au tutorial suivant : https://danevanderbilt.com/2019/11/13/how-to-run-openais-gpt-2-text-generator-on-macos/
Tout s'est bien passé (via le terminal) jusqu'à la commande suivante :
def interact_model(
    model_name='345M',
    seed=None,
    nsamples=1,
    batch_size=1,
    length=None,
    temperature=1,
    top_k=40,
    top_p=1,
    models_dir='models',
):
où le terminal me renvoie l'erreur suivante :
(venv-gpt-2) Mac-mini:gpt-2 xorian$ def interact_model(
-bash: syntax error near unexpected token `('
(venv-gpt-2) Mac-mini:gpt-2 xorian$     model_name='345M',
(venv-gpt-2) Mac-mini:gpt-2 xorian$     seed=None,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     nsamples=1,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     batch_size=1,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     length=None,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     temperature=1,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     top_k=40,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     top_p=1,
(venv-gpt-2) Mac-mini:gpt-2 xorian$     models_dir='models',
(venv-gpt-2) Mac-mini:gpt-2 xorian$ ):
-bash: syntax error near unexpected token `)'
1ere question : pourriez vous m'indiquer, svp, ce qu'il ne va pas dans cette commande.Je pense qu'il s'agit de quelque chose de banal (problème de parenthèse ou de ponctuation).
Seconde question en suivant ce tutoriel j'ai donc créé un environnement virtuel (venv-gpt-2).Lorsque que je quitte le terminal puis que je le relance comment dois je faire pour réentrer dans cet environnement virtuel ? Dois je retaper :

1
2
3
4python3 -m venv ~/venv-gpt-2
. ~/venv-gpt-2/bin/activate
ou simplement la ligne 3 . ~/venv-gpt-2/bin/activate ou autre chose ?
Dernière question : ou puis je trouver sur mon mac le fichier nommé 345M téléchargé via la ligne de commande du terminal.
D'avance merci.


----------



## Nanardtetard (16 Juin 2020)

Bonjour,

Est ce que tu executes ce code depuis un fichier *.py ?

Dans le tutoriel, ce serait le fichier *src/interactive_conditional_samples.py.*

Pour la dernière question, il faut regarder dans le fichier *download_model.py* ce qu'il fait exactement, sinon je presume qu'il sera téléchargé dans le dossier courant de ton terminal.


----------



## xorian (16 Juin 2020)

Nanardtetard a dit:


> Bonjour,
> 
> Est ce que tu execute ce code depuis un fichier *.py ?
> 
> Dans le tutoriel, ce serait le fichier *src/interactive_conditional_samples.py.*


Bonjour Nanardtetard
j'ai installé Python 3 et exécuté les premières commandes du tutoriel jusqu'a 
def interact_model(
    model_name='345M',
    seed=None,
    nsamples=1,
    batch_size=1,
    length=None,
    temperature=1,
    top_k=40,
    top_p=1,
    models_dir='models',
):
où le terminal m'a renvoyé l'erreur. Je ne suis donc pas allé plus loin pour l'instant et je n'ai donc pas effectué *src/interactive_conditional_samples.py puisque je plante juste avant*


----------



## Nanardtetard (16 Juin 2020)

En fait la partie "Running the model" doit être dans le fichier interactive_conditional_sample.py.
Ils te demandent d'éditer ce fichier py pour correspondre au modele qui a été telechargé juste avant.

Ton erreur vient d'une erreur de syntaxe car tu veux rentrer cette commande ligne par ligne et du coup elle est incomplete.
En utilisant le fichier (préalablement édité) tu n'auras plus de problème.

C'est pourquoi, ils disent ensuite d'executer le fichier avec "python3 src/interactive_machin_truc.py"


----------



## xorian (16 Juin 2020)

Nanardtetard a dit:


> En fait la partie "Running the model" doit être dans le fichier
> 
> 
> Nanardtetard a dit:
> ...


Si j'exécute via le terminal la commande : 
python3 *src/interactive_conditional_samples.py*

j'obtiens la réponse suivante :
(venv-gpt-2) Mac-mini:gpt-2 xorian$ python3 src/interactive_conditional_samples.py
Illegal instruction: 4


----------



## xorian (16 Juin 2020)

xorian a dit:


> Si j'exécute via le terminal la commande :
> python3 *src/interactive_conditional_samples.py*
> 
> j'obtiens la réponse suivante :
> ...


oui je crois que j'ai compris.Je doit éditer le fichier *interactive_conditional_samples.py (via Atom par exemple) et définir les variables.Reste à savoir où je trouve ce fichier sur mon mac.*


----------



## Nanardtetard (16 Juin 2020)

Peux tu poster le contenu de ce fichier python ? (Dans des balises "Bloc de code") Merci.


----------



## Nanardtetard (16 Juin 2020)

xorian a dit:


> oui je crois que j'ai compris.Je doit éditer le fichier *interactive_conditional_samples.py (via Atom par exemple) et définir les variables.Reste à savoir où je trouve ce fichier sur mon mac.*



Oui c'est ca.

Je suis allé voir le fichier dowload_model.py sur le GitHub.
Les fichiers téléchargés devraient être present dans le meme repertoire que le fichier download_model.py.


----------



## xorian (16 Juin 2020)

Nanardtetard a dit:


> Peux tu poster le contenu de ce fichier python ? (Dans des balises "Bloc de code") Merci.


oui merci c'est bon Nanardtetard, j'ai trouvé le fichier sur mon mac et c'est donc bien lui qu'il faut que je modifie le voici (avant modification) :


#!/usr/bin/env python3

import fire
import json
import os
import numpy as np
import tensorflow as tf

import model, sample, encoder

def interact_model(
    model_name='124M',
    seed=None,
    nsamples=1,
    batch_size=1,
    length=None,
    temperature=1,
    top_k=0,
    top_p=1,
    models_dir='models',
):
    """
    Interactively run the model
    :model_name=124M : String, which model to use
    :seed=None : Integer seed for random number generators, fix seed to reproduce
     results
    :nsamples=1 : Number of samples to return total
    :batch_size=1 : Number of batches (only affects speed/memory).  Must divide nsamples.
    :length=None : Number of tokens in generated text, if None (default), is
     determined by model hyperparameters
    :temperature=1 : Float value controlling randomness in boltzmann
     distribution. Lower temperature results in less random completions. As the
     temperature approaches zero, the model will become deterministic and
     repetitive. Higher temperature results in more random completions.
    :top_k=0 : Integer value controlling diversity. 1 means only 1 word is
     considered for each step (token), resulting in deterministic completions,
     while 40 means 40 words are considered at each step. 0 (default) is a
     special setting meaning no restrictions. 40 generally is a good value.
     :models_dir : path to parent folder containing model subfolders
     (i.e. contains the <model_name> folder)
    """
    models_dir = os.path.expanduser(os.path.expandvars(models_dir))
    if batch_size is None:
        batch_size = 1
    assert nsamples % batch_size == 0

    enc = encoder.get_encoder(model_name, models_dir)
    hparams = model.default_hparams()
    with open(os.path.join(models_dir, model_name, 'hparams.json')) as f:
        hparams.override_from_dict(json.load(f))

    if length is None:
        length = hparams.n_ctx // 2
    elif length > hparams.n_ctx:
        raise ValueError("Can't get samples longer than window size: %s" % hparams.n_ctx)

    with tf.Session(graph=tf.Graph()) as sess:
        context = tf.placeholder(tf.int32, [batch_size, None])
        np.random.seed(seed)
        tf.set_random_seed(seed)
        output = sample.sample_sequence(
            hparams=hparams, length=length,
            context=context,
            batch_size=batch_size,
            temperature=temperature, top_k=top_k, top_p=top_p
        )

        saver = tf.train.Saver()
        ckpt = tf.train.latest_checkpoint(os.path.join(models_dir, model_name))
        saver.restore(sess, ckpt)

        while True:
            raw_text = input("Model prompt >>> ")
            while not raw_text:
                print('Prompt should not be empty!')
                raw_text = input("Model prompt >>> ")
            context_tokens = enc.encode(raw_text)
            generated = 0
            for _ in range(nsamples // batch_size):
                out = sess.run(output, feed_dict={
                    context: [context_tokens for _ in range(batch_size)]
                })[:, len(context_tokens):]
                for i in range(batch_size):
                    generated += 1
                    text = enc.decode(out_)
                    print("=" * 40 + " SAMPLE " + str(generated) + " " + "=" * 40)
                    print(text)
            print("=" * 80)

if *name* == '*main*':
    fire.Fire(interact_model)_


----------



## xorian (16 Juin 2020)

xorian a dit:


> oui merci c'est bon Nanardtetard, j'ai trouvé le fichier sur mon mac et c'est donc bien lui qu'il faut que je modifie le voici (avant modification) :
> 
> 
> #!/usr/bin/env python3
> ...


J'ai donc édité le fichier avec Atom et j'ai simplement remplacé 124 par 345 à la ligne def interact_model(
    model_name='124M',
J'ai enregistré le fichier puis je suis revenu dans le terminal pour lancer la commande :
(venv-gpt-2) Mac-mini:gpt-2 xorian$  python3 src/interactive_conditional_samples.py
mais le terminal me renvoie l'erreur :
Illegal instruction: 4


----------



## Nanardtetard (17 Juin 2020)

Arf, est ce que les indentations sont bien respectées ?


----------



## xorian (17 Juin 2020)

Nanardtetard a dit:


> Arf, est ce que les indentations sont bien respectées ?


Bonjour Nanardtetard,
A priori je ne suis pas le seul à avoir ce problème et cela proviendrait de la version de numpy qui est utilisée. Voir ici https://github.com/conda/conda/issues/9678.
Je précise que je suis sur un mac mini 4.1 de 2011 sur lequel j'ai installé Mojave via le patch Dosdude
J'ai donc désinstallé numpy en faisant pip3 uninstall numpy. Puis j'en ai installé une plus ancienne en passant par pip3 install mais j'ai toujours la même erreur et visiblement il faut passer par conda et là il faut que j'essaye de comprendre comment ça marche pour installer conda proprement. Et après l'avoir installé faut il simplement réinstaller numpy via conda ou faut il tout reinstaller y compris Python ?


----------



## Nanardtetard (17 Juin 2020)

Es-tu sur que c'est le package numpy qui pose problème ?
 -> Essaie d'executer ton fichier en commentant l'import et les utilisations de numpy. A priori il n'est utilisé que pour obtenir une valeur aléatoire.

Si une version précédente fonctionne, as-tu bien fait :

```
pip3 install numpy==x.y.z
```
Avec x.y.z la version qui fonctionnerait.


----------



## xorian (17 Juin 2020)

Nanardtetard a dit:


> Es-tu sur que c'est le package numpy qui pose problème ?
> -> Essaie d'executer ton fichier en commentant l'import et les utilisations de numpy. A priori il n'est utilisé que pour obtenir une valeur aléatoire.
> 
> Si une version précédente fonctionne, as-tu bien fait :
> ...


Oui j'ai bien fait pip3 install numpy==x.y.z
Et comment je fais pour commenter l'import et les utilisations de numpy ?


----------



## Nanardtetard (17 Juin 2020)

Pour commenter une ligne, il faut mettre le symbole # au debut de la ligne.
Ou """ pour commenter plusieurs lignes.

Exemple :

```
# Ceci est un commentaire
import os # Ceci est un commentaire
"""
Ceci un commentaire de
plusieurs
lignes
"""
```


----------



## xorian (17 Juin 2020)

Nanardtetard a dit:


> Pour commenter une ligne, il faut mettre le symbole # au debut de la ligne.
> Ou """ pour commenter plusieurs lignes.
> 
> Exemple :
> ...


Je comprends pas à quoi ça sert de commenter le fichier car quand je vais l'exécuter via le terminal je ne verrais rien de plus ?


----------



## Nanardtetard (17 Juin 2020)

xorian a dit:


> Je comprends pas à quoi ça sert de commenter le fichier car quand je vais l'exécuter via le terminal je ne verrais rien de plus ?


Je ne dis pas de commenter tout le fichier. Juste les parties qui pourraient poser problème pour justement identifier et localiser précisément le problème.

Sinon, tu peux installer Visual Studio Code avec les extensions pour Python, il a un bon debugger.


----------



## Nanardtetard (19 Juin 2020)

Hello, Tu as réussi à te dépatouiller avec ton script python ?


----------

