web-dev-qa-db-fra.com

Comment exécuter Tensorboard à partir du script python dans virtualenv?

Tensorboard doit être démarré à partir d'une ligne de commande comme celle-ci:

tensorboard --logdir=path

J'ai besoin de l'exécuter à partir du code. Jusqu'à présent, j'utilise ceci:

import os
os.system('tensorboard --logdir=' + path)

Cependant, le tensorboard ne démarre pas car il n'est pas inclus dans le chemin d'accès système. J'utilise PyCharm avec virtualenv sur Windows. Je ne veux pas modifier les chemins d'accès du système, la seule option consiste à l'exécuter à partir de virtualenv. Comment faire ça?

20
Na Na

Probablement un peu tard pour une réponse, mais c'est ce qui a fonctionné pour moi dans Python 3.6.2:

import tensorflow as tf
from tensorboard import main as tb
tf.flags.FLAGS.logdir = "/path/to/graphs/"
tb.main()

Cela exécute tensorboard avec la configuration par défaut et recherche des graphiques et des résumés dans "/ path/to/graphs /". Vous pouvez bien sûr modifier le répertoire des journaux et définir autant de variables que vous le souhaitez en utilisant:

tf.flags.FLAGS.variable = value

J'espère que ça aide.

10
Rive

Comme je reçois le même problème, vous pouvez utiliser ces lignes inspirées de tensorboard\main.py:

from tensorboard import default
from tensorboard import program

tb = program.TensorBoard(default.PLUGIN_LOADERS, default.get_assets_Zip_provider())
tb.configure(argv=['--logdir', my_directory])
tb.main()

Avec my_directory Comme dossier que vous souhaitez vérifier. N'oubliez pas de créer un Thread séparé si vous voulez éviter d'être bloqué après tb.main(). Meilleures salutations

EDIT Tensorboard V1.10:

Pour des raisons personnelles, je l'écris d'une manière différente:

class TensorBoardTool:

    def __init__(self, dir_path):
        self.dir_path = dir_path

    def run(self):
        # Remove http messages
        log = logging.getLogger('werkzeug')
        log.setLevel(logging.ERROR)
        # Start tensorboard server
        tb = program.TensorBoard(default.PLUGIN_LOADERS, default.get_assets_Zip_provider())
        tb.configure(argv=['--logdir', self.dir_path])
        url = tb.launch()
        sys.stdout.write('TensorBoard at %s \n' % url)

EDIT Tensorboard V1.12:

Selon Elad Weiss et tsbertalan pour la version 1.12 du tensorboard.

    def run(self):
        # Remove http messages
        log = logging.getLogger('werkzeug').setLevel(logging.ERROR)
        # Start tensorboard server
        tb = program.TensorBoard(default.get_plugins(), default.get_assets_Zip_provider())
        tb.configure(argv=[None, '--logdir', self.dir_path])
        url = tb.launch()
        sys.stdout.write('TensorBoard at %s \n' % url)

Ensuite, pour l'exécuter, faites simplement:

# Tensorboard tool launch
tb_tool = TensorBoardTool(work_dir)
tb_tool.run()

Cela vous permettra d'exécuter un serveur Tensorboard en même temps que votre processus principal, sans déranger la requête http!

7
Romain Cendre

Utilisation de l'API Tensorboard 2 (2019):

from tensorboard import program
tb = program.TensorBoard()
tb.configure(argv=[None, '--logdir', tracking_address])
url = tb.launch()

Remarque: tb.launch () crée un thread démon qui mourra automatiquement lorsque votre processus sera terminé

7
Daniel Braun

Vous devez lancer tensorBoard dans le thread séparé:

def launchTensorBoard():
    import os
    os.system('tensorboard --logdir=' + tensorBoardPath)
    return

import threading
t = threading.Thread(target=launchTensorBoard, args=([]))
t.start()
6
Dmitry

Si votre python chemin d'interpréteur est :

/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/bin/python3.6

Vous pouvez exécuter cette commande au lieu de tensorboard

/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6 /lib/python3.6/site-packages/tensorboard/main.py

Ça marche pour moi.

2
lovefish

Pour Tensorboard 2.1.0, cela fonctionne pour moi: python -m tensorboard.main --logdir $ PWD/logs

Vous devez d'abord avoir votre env actif. (Dans mon cas, l'installation de conda a eu une erreur fatale, j'ai donc dû réinstaller tf via pip à l'intérieur de conda.)

2
Michael Steinberg

Ce qui suit ouvrira un onglet Chrome et lance TensorBoard. Fournissez simplement le répertoire souhaité et le nom de votre système.

import os
os.system(
    "cd <directory> \
    && google-chrome http://<your computer name>:6007 \
    && tensorboard --port=6007 --logdir runs"
) 
0
Miladiouss

À partir de la version 1.9.0 de TensorBoard, les travaux suivants permettent de démarrer TensorBoard avec les paramètres par défaut dans le même processus Python:

import tensorboard as tb
import tensorboard.program
import tensorboard.default

tb.program.FLAGS.logdir = 'path/to/logdir'
tb.program.main(tb.default.get_plugins(),
                tb.default.get_assets_Zip_provider())
0
Agost Biro

A eu le même problème: Comme vous travaillez sur Windows, vous pouvez utiliser des fichiers batch pour automatiser entièrement l'ouverture du tensorboard comme dans l'exemple ci-dessous.

Comme vous voulez probablement ouvrir tensorboard dans une fenêtre de console visible (cmd.exe). L'appel d'un fichier batch dans votre IDE (pycharm) l'exécutera dans l'IDE, donc en arrière-plan, ce qui signifie que vous ne pouvez pas voir la console. Par conséquent, vous pouvez utiliser une solution de contournement: appeler un fichier batch qui appelle ensuite le fichier batch pour démarrer tensorboard.

Remarque: j'utilise Anaconda comme environnement virtuel pour cet exemple

batch_filename = 'start_tb.bat'  # set filename for batch file
tb_command = 'tensorboard --logdir=' + log_dir  # join strings for tensorflow command

# creates batch file that will call seconds batch file in console window (cmd.exe)
with open(os.path.join('invoke.bat'), "w") as f:
    f.writelines('start ' + batch_filename)

# created batch file that activates Anaconda environment and starts tensorboard
with open(os.path.join(batch_filename), "w") as f:
    f.writelines('\nconda activate YOURCondaEnvNAME  && ' + tb_command)  # change to your conda environment, or other virtualenv

# starts tensorboard using the batch files (will open console window)
# calls the 'invoke.bat' that will call 'start_tb.bat'
os.system('invoke.bat')

# starts tensorboard in default browser >> ATTENTION: must be adapted to local Host
os.system('start "" http://YOUR-COMPUTER-NAME:6006/')  # just copy the URL that tensorboard runs at on your computer

Parfois, vous devrez peut-être actualiser le tensorboard dans votre navigateur, car il s'est déjà ouvert avant d'être correctement configuré.

0
Martin

Une solution complète pour Tensorboard 2 (2019), avec ouverture automatique du navigateur Chrome, pour Windows. Fonctionne pour les deux environnements: conda et virtualenv.

from multiprocessing import Process
import sys
import os

class TensorboardSupervisor:
    def __init__(self, log_dpath):
        super().__init__()
        if os.name != 'nt':
            raise NotImplementedError("Support only for Windows")
        self.server = TensorboardServer(log_dpath)
        self.chrome = ChromeProcess()
        self.server.start()
        self.chrome.start()

    def finalize(self):
        self.server.join()
        self.chrome.join()


class TensorboardServer(Process):
    def __init__(self, log_dpath):
        super().__init__()
        self.log_dpath= str(log_dpath)

    def run(self):
        # Supress prints to STDERR: 
        os.system(f'{sys.executable} -m tensorboard.main --logdir={self.log_dpath} 2> NUL')


class ChromeProcess(Process):
    def run(self):
        os.system(f'start chrome  http://localhost:6006/')

Initialisation:

tb_sup = TensorboardSupervisor('path/to/logs')

Après avoir terminé la formation/les tests:

tb_sup.finalize()
0
Mano