質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1629閲覧

【Python】RuntimeError(multiprocess関係)対応のためのif __name__ == '__main__':の記述の仕方が分からない

Kokode

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/26 14:42

前提・実現したいこと

環境:windows10
言語:Python3.6.8
ターミナル:Git Bash
ソフトウェア:become-yukarin

A.3 第1段を使った音声変換
上記のリンク先の記事を参考に作業を行っており、以下のコマンドを実行しました。

python become-yukarin/scripts/voice_conversion_test.py 1st_yukari_model_by \ -iwd dat/1st_models_by/yukari/voice_pair/own \ -md dat/1st_models_by/yukari \ -it 120000

このコマンドで音声変換ができるはずなのですが、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

yff30@DESKTOP-DPOI2G3 MINGW64 /d/ユーザー名hdd/deep_yukarin $ python become-yukarin/scripts/voice_conversion_test.py 1st_yukari_model_by \ > -iwd dat/1st_models_by/yukari/voice_pair/own \ > -md dat/1st_models_by/yukari \ > -it 120000 Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\spawn.py", line 105, in spawn_main exitcode = _main(fd) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\spawn.py", line 114, in _main prepare(preparation_data) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\spawn.py", line 225, in prepare _fixup_main_from_path(data['init_main_from_path']) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path run_name="__mp_main__") File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "D:\hidekazuhdd\deep_yukarin\become-yukarin\scripts\voice_conversion_test.py", line 73, in <module> pool = multiprocessing.Pool() File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\context.py", line 119, in Pool context=self.get_context()) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 174, in __init__ self._repopulate_pool() File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 239, in _repopulate_pool w.start() File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 105, in start self._popen = self._Popen(self) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\context.py", line 322, in _Popen return Popen(process_obj) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__ prep_data = spawn.get_preparation_data(process_obj._name) File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\spawn.py", line 143, in get_preparation_data _check_not_importing_main() File "C:\Users\yff30\AppData\Local\Programs\Python\Python36\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main is not going to be frozen to produce an executable.''') RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable. dat\1st_models_by\yukari\1st_yukari_model_by\predictor_120000.npz

エラーメッセージと想定される解決法

このエラーメッセージについて調べを進めていったところ、以下のリンクの記事が見つかりました。
multiprocessを使ったコードをpython setup.py testする
WindowsでCUDA+PyTorchのサンプル実行するまでのメモ
Python で並列処理(初めての人向け)

これらの記事の内容から、おそらく該当のソースコードに

def main() if __name__ == '__main__': main()

これらを記述する必要があると考えました。

該当のソースコード(voice_conversion_test.py)

import argparse import glob import multiprocessing import re from functools import partial from pathlib import Path import librosa import numpy from become_yukarin import AcousticConverter from become_yukarin.config.config import create_from_json as create_config parser = argparse.ArgumentParser() parser.add_argument('model_names', nargs='+') parser.add_argument('-md', '--model_directory', type=Path, default=Path('/mnt/dwango/hiroshiba/become-yukarin/')) parser.add_argument('-iwd', '--input_wave_directory', type=Path, default=Path('/mnt/dwango/hiroshiba/become-yukarin/dataset/hiho-wave/hiho-pause-atr503-subset/')) parser.add_argument('-it', '--iteration', type=int) parser.add_argument('-g', '--gpu', type=int) args = parser.parse_args() model_directory = args.model_directory # type: Path input_wave_directory = args.input_wave_directory # type: Path it = args.iteration gpu = args.gpu paths_test = list(Path('./test_data/').glob('*.wav')) def extract_number(f): s = re.findall("\d+", str(f)) return int(s[-1]) if s else -1 def process(p: Path, acoustic_converter: AcousticConverter): try: if p.suffix in ['.npy', '.npz']: fn = glob.glob(str(input_wave_directory / p.stem) + '.*')[0] p = Path(fn) wave = acoustic_converter(p) librosa.output.write_wav(str(output / p.stem) + '.wav', wave.wave, wave.sampling_rate, norm=True) except: import traceback print('error!', str(p)) print(traceback.format_exc()) for model_name in args.model_names: base_model = model_directory / model_name config = create_config(base_model / 'config.json') input_paths = list(sorted([Path(p) for p in glob.glob(str(config.dataset.input_glob))])) numpy.random.RandomState(config.dataset.seed).shuffle(input_paths) path_train = input_paths[0] path_test = input_paths[-1] if it is not None: model_path = base_model / 'predictor_{}.npz'.format(it) else: model_paths = base_model.glob('predictor_*.npz') model_path = list(sorted(model_paths, key=extract_number))[-1] print(model_path) acoustic_converter = AcousticConverter(config, model_path, gpu=gpu) output = Path('./output').absolute() / base_model.name output.mkdir(exist_ok=True) paths = [path_train, path_test] + paths_test process_partial = partial(process, acoustic_converter=acoustic_converter) if gpu is None: pool = multiprocessing.Pool() pool.map(process_partial, paths) else: list(map(process_partial, paths))

質問したいこと

エラーの内容と考えられる解決法までは調べられたのですが、
果たして上記の該当のソースコードのどの部分にどのように記述すれば良いのか分からず困っています。
if name=='main'でどのように囲めばよいのかご教授いただきたく思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/07/26 15:12

Windows向けに移植したいということでしょうか
Kokode

2020/07/26 15:26

推奨環境はLinux OSとなっているので、移植(?)ということになるでしょうか。 https://qiita.com/BURI55/items/7bcac3ef68114c193344 https://togetter.com/li/1520579 上記の記事も参考にしつつ、windows上で作業を進めていたところ今回の問題に遭遇しました。 if name=='main'で全体を囲って実行したらできたという情報も見かけたのですが、具体的にどうすれば良いのかわからず、今回質問させていただきました。
quickquip

2020/07/26 23:54 編集

具体的な直し方が分からないのにも関わらず、Linuxで動かすことが前提のコードをWindowsで動かすと決めたことに対する、妥当な理由が思いつかなかったのでつい聞いてしまいました。(ここでこれをやっておけばmultiprocessingの実地での勉強になると判断した、とかありえるか? 程度で) 今の状況は「単なる作業依頼」になっていると思います。
Kokode

2020/07/27 02:09

質問への追記ありがとうございます。 プログラミングして一からソフトウェアを作るわけではなく、実行するだけなら未経験でも可能かと思いましたがやはり一筋縄ではいかないですね。 ひとまずdef main():, if __name__ == '__main__':で色々な部分を囲ってみて解決策を探ろうと思います。
guest

回答1

0

質問への回答ではないのですが、ただ動かすだけなら

python

1 if gpu is None: 2 pool = multiprocessing.Pool() 3 pool.map(process_partial, paths) 4 else: 5 list(map(process_partial, paths))

python

1 list(map(process_partial, paths))

にしてシングルプロセスで動くようにする方がまだ早そうです。(multiprocessingで動くように修正する時間と、実行に必要な時間とどっちが早いかという話)

投稿2020/07/27 02:24

quickquip

総合スコア11051

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kokode

2020/07/27 03:15

ご教授本当に本当にありがとうございます。 自分でmultiprocess関係の問題だと言っておきながら、該当のソースコードのどの部分が問題になっているのか分かっていませんでした。 動かすだけなら if gpu is None:のコードを変えればよいというご回答は大変参考になりました。 ご指摘の箇所を def main(): と if __name__ == '__main__': main() で囲ってみたところ、エラーを吐くことなく実行することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問