Как установить переменную окружения PYTHONHASHSEED в PyCharm для тестирования модели Word2Ve c? - PullRequest
1 голос
/ 29 марта 2020

Мне нужно написать полностью воспроизводимый тест Word2Ve c и установить фиксированное значение PYTHONHASHSEED. Это мой нынешний сет-йп

# conftest.py
@pytest.fixture(autouse=True)
def env_setup(monkeypatch):
    monkeypatch.setenv("PYTHONHASHSEED", "123")

# test_w2v.py

def test_w2v():
    assert os.getenv("PYTHONHASHSEED") == "123"
    expected_words_embeddings = np.array(...)
    w2v = Word2Vec(my_tokenized_sentences, workers=1, seed=42, hashfxn=hash)
    words_embeddings = np.array([w2v.wv.get_vector(word) for word in sentence for sentence in my_tokenized_sentences)])
    np.testing.assert_array_equal(expected_words_embeddings, words_embeddings)

Вот любопытная вещь.

Если я запускаю тест из терминала, выполняя PYTHONHASHSEED=123 python3 -m pytest test_w2v.py, тест проходит без проблем. Однако, если я запускаю тест из PyCharm (используя pytest, настроенный из Edit Configurations -> Templates -> Python tests -> pytest), то он терпит неудачу. Самое интересное, что это не ошибка на assert os.getenv("PYTHONHASHSEED") == "123", но это ошибка на np.testing.assert_array_equal(expected_words_embeddings, words_embeddings)

Почему это может быть так, и есть ли способ исправить эту проблему?

1 Ответ

2 голосов
/ 30 марта 2020

Вы не можете установить PYTHONHASHSEED в Python коде; его нужно установить до запуска интерпретатора Python, потому что это единственный раз, когда интерпретатор обращается к нему. Вы можете установить его глобально, перед запуском PyCharm, или может существовать опция PyCharm для установки переменных среды для любой среды выполнения, которую вы запускаете из PyCharm. (См., Например: Как установить переменные окружения в PyCharm? )

Но в целом вам не следует пытаться заставить свои gensim Word2Vec проверять эту детерминированность c.

Если все, что вы тестируете, , что чувствительно к точным параметрам - потому что только точное посевное и (намного более медленное) однопоточное обучение попадает в выбранные вами допуски или получает точный ответ вы скопировали из более раннего прогона - тогда вы на самом деле не проверяете вклад алгоритма в тех видах реальной случайности, которым он обычно подвержен. Дополнительную информацию см. В gensim FAQ .

...