Skip to content

Bug in using Khiops with env vars to enable memory stats log analysis #435

@marcboulle

Description

@marcboulle

Description

Khiops peut-être paramétré via des variables d'environnement pour analyser finement le profil d'utilisation mémoire et cpu au cours de l'exécution des tâches de l'outil.
Ce mode d'utilisation est d'usage interne pour l'équipe de développement, et il est très précieux pour auditer les éventuels problèmes de performance.

On peut le lancer avec la version core de Khiops, mais son lancement via Khiops python aboutit actuellement à un bug.

Lancement depuis core

Exemple de scenario de base, d'apprentissage sur la base Adult, sur un PC windows:

ClassManagement.OpenFile       // Open...
ClassFileName C:\Users\Public\khiops_data\samples\Adult\Adult.kdic     // Dictionary file
OK                             // Open

TrainDatabase.DatabaseSpec.Data.DatabaseFiles.List.Key       // List item selection
TrainDatabase.DatabaseSpec.Data.DatabaseFiles.DataTableName C:\Users\Public\khiops_data\samples\Adult\Adult.txt          // Data table file
AnalysisSpec.TargetAttributeName class   // Target variable
AnalysisSpec.PredictorsSpec.ConstructionSpec.MaxTreeNumber 0 // Max number of trees
AnalysisResults.ReportFileName C:\Users\Public\khiops_data\samples\Adult\TrainWithLogs\AnalysisResults.khj     // Analysis report
ComputeStats                   // Train model
Exit                           // Close
OK                             // Yes

Fichier de commande Windows de lancement de Khiops, en ayant paramétré les variables d'environnement:

REM Set parameters to collect mem stats logs
REM - KhiopsMemStatsLogFileName: None, memory stats log file name
REM - KhiopsMemStatsLogFrequency: None, frequency of allocator stats collection (0, 100000, 1000000,...)
REM - KhiopsMemStatsLogToCollect: None, stats to collect (8193: only time and labels, 16383: all,...)
REM - KhiopsIOTraceMode: None, to collect IO trace (false, true) (beware: can be verbose)
set KhiopsMemStatsLogFileName=C:\Users\Public\khiops_data\samples\Adult\TrainWithLogs\MemStats\KhiopsMemoryStats.log
set KhiopsMemStatsLogFrequency=100000
set KhiopsMemStatsLogToCollect=16383

call "%KHIOPS_HOME%\bin\khiops" -i scenario_train_adult._kh -e C:\Users\Public\khiops_data\samples\Adult\TrainWithLogs\log.txt -b

On obtient alors les logs souhaités dans le répertoire
C:\Users\Public\khiops_data\samples\Adult\TrainWithLogs\MemStats.

A noter: avec ce mode d'utilisation, Khiops core écrit des informations dans la console, rappelant le contexte:

MemoryStatsManager activated
	KhiopsMemStatsLogFileName=C:\Users\Public\khiops_data\samples\Adult\TrainWithLogs\MemStats\KhiopsMemoryStats.log
	KhiopsMemStatsLogFrequency=100000
	KhiopsMemStatsLogToCollect=16383
MemoryStatsManager activated
	KhiopsMemStatsLogFileName=C:\Users\Public\khiops_data\samples\Adult\TrainWithLogs\MemStats\KhiopsMemoryStats.log
	KhiopsMemStatsLogFrequency=100000
	KhiopsMemStatsLogToCollect=16383
...

Lancement depuis khiops python

Script python équivalent:

# Imports
import os
from khiops import core as kh

# Set the file paths
adult_path = os.path.join(kh.get_samples_dir(), "Adult")
dictionary_file_path = os.path.join(adult_path, "Adult.kdic")
data_table_path = os.path.join(adult_path, "Adult.txt")
analysis_report_file_path = os.path.join(adult_path, "TrainWithLogs", "AnalysisResults.khj")
log_file_path = os.path.join(adult_path, "TrainWithLogs", "log.txt")

# Set parameters to collect mem stats logs
# - KhiopsMemStatsLogFileName: None, memory stats log file name
# - KhiopsMemStatsLogFrequency: None, frequency of allocator stats collection (0, 100000, 1000000,...)
# - KhiopsMemStatsLogToCollect: None, stats to collect (8193: only time and labels, 16383: all,...)
# - KhiopsIOTraceMode: None, to collect IO trace (false, true) (beware: can be verbose)
os.environ['KhiopsMemStatsLogFileName'] = os.path.join(adult_path, "TrainWithLogs", "MemStats", "KhiopsMemoryStats.log")
os.environ['KhiopsMemStatsLogFrequency'] = '100000'
os.environ['KhiopsMemStatsLogToCollect'] = '16383'

# Train the predictor
try:
    kh.train_predictor(
        dictionary_file_path,
        "Adult",
        data_table_path,
        "class",
        analysis_report_file_path,
        max_trees=0,
        log_file_path=log_file_path
    )
except Exception as e:
    print(f"An error occurred: {e}")

Cela marche en commentant les lignes de paramétrage des variables d'environnement.
Sinon, cela plante, avec le message d'erreur suivant:

An error occurred: cannot access local variable 'khiops_version_str' where it is not associated with a value
Process finished with exit code 0

Questions/Ideas

Hypothèse sur le dysfonctionnement:

  • un bug interne n'est pas géré en cas de fonctionnement non nominal
  • ce fonctionnement non nominal est probablement déclenché par les informations émises par Khiops core dans la console

Metadata

Metadata

Assignees

Labels

Priority/0-HighTo do nowSize/HoursVery shortStatus/DoneThe issue has been addressed and merged to the dev branch

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions