从 Jupyter Notebook 运行带有可变解析器参数的 python 脚本

Posted

技术标签:

【中文标题】从 Jupyter Notebook 运行带有可变解析器参数的 python 脚本【英文标题】:Running python scripts with variable parser arguments from Jupyter Notebook 【发布时间】:2020-04-08 03:22:31 【问题描述】:

我正在处理transformers。

我有一个 python 脚本,它通过 argparse 将参数作为输入。

这是其中的一部分:

    parser = argparse.ArgumentParser()
    parser.add_argument("--model_type", default=None, type=str, required=True,
                        help="Model type selected in the list: " + ", ".join(MODEL_CLASSES.keys()))
    parser.add_argument("--model_name_or_path", default=None, type=str, required=True,
                        help="Path to pre-trained model or shortcut name selected in the list: " + ", ".join(ALL_MODELS))

我希望能够使用不同的参数迭代地调用脚本。 我可以使用 %run 或 !python bash command> 调用脚本,但我不能将变量传递给它以解释为参数,因为它将变量视为实际的字符串值:

%run examples/run_lm_finetuning.py --gradient_accumulation_steps=1 --output_dir='output_medium' --model_type='gpt2' \
                      --model_name_or_path=model_load --do_train --train_data_file='/root/sharedfolder/omri/data/pieces/backup/'.format(file)\
                      --overwrite_output_dir --per_gpu_train_batch_size=1 --per_gpu_eval_batch_size=1 --save_total_limit=5

返回:

OSError: Model name 'model_load' was not found in 
model name list (gpt2, gpt2-medium, gpt2-large, gpt2-xl, distilgpt2). 

We assumed 'model_load' was a path or url to a configuration file named 
config.json or a directory containing such a file but couldn't find any 
such file at this path or url.

【问题讨论】:

【参考方案1】:

看起来 扩展了变量。我在尝试使用 Python f'' 格式化时偶然发现了它。我在%run docs 中没有看到它;它必须是 %magic 语法的一部分。

无论如何,用一个简单的echo 脚本:

In [29]: cat echo.py                                                            
import sys
print(sys.argv)

In [30]: foo = "a string"                                                       

In [31]: run echo.py foo bar                                                  
['echo.py', 'a', 'string', 'bar']
In [32]: run echo.py "foo" bar                                                
['echo.py', 'a string', 'bar']

===

用另一种魔法

In [71]: astr="*.h5"                                                            
In [72]: ls astr                                                              
abc_copy.h5  string.h5          testdate.h5       test_str.h5...

===

$ 也这样做:

In [79]: foo = "a string"                                                       
In [80]: run echo.py $foo bar                                                   
['echo.py', 'a', 'string', 'bar']

How to pass a variable to magic ´run´ function in IPython

IPython.core.magic.no_var_expand(magic_func) 将魔术函数标记为不需要变量扩展

默认情况下,IPython 将传递给魔法的行中的 a 或 $a 解释为变量,这些变量应该在将行传递给魔法函数之前从交互式命名空间进行插值。这并不总是可取的,例如当魔法执行 Python 代码时(%timeit、%time 等)。使用 @no_var_expand 装饰魔法以选择退出变量扩展。

https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.magic.html

【讨论】:

【参考方案2】:

RafalS 的回答很棒,但如果你愿意,它不会打印标准输出, 方法如下:

将整个语句放在一个fstring中并赋值给一个变量run

run = f"python examples/run_lm_finetuning.py\
                    --model_name_or_path=model_load\
                    --train_data_file='/root/sharedfolder/omri/data/pieces/backup/file'\
                    --overwrite_output_dir\
                    --per_gpu_train_batch_size=1\
                    --per_gpu_eval_batch_size=1\
                    --save_total_limit=5"

然后通过简单的方式运行 Jupyter shell:

!run

【讨论】:

【参考方案3】:

所以%run 中的model_load 应该被解释为python 变量?那会有点奇怪,你不觉得吗?尝试直接从 python 调用 python,而不是通过 ipython 魔术函数:

In [18]: import subprocess                                                                                                                                                                            

In [19]: model_load = "gpt2"                                                                                                                                                                          

In [20]: subprocess.run(f"python file.py --model_name_or_path=model_load", shell=True)

【讨论】:

这并不奇怪,因为 model_load 实际上是权重的路径。因此,在我完成使用默认权重训练单个文件后,我需要重定向路径。但实际上我更需要它来遍历文件,这只是一个示例,您的解决方案很棒,但不会在 Jupyter 上打印标准输出,我正在为您的建议发布改进

以上是关于从 Jupyter Notebook 运行带有可变解析器参数的 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

为啥jupyter notebook代码运行一直没有反应

为啥jupyter notebook代码运行一直没有反应?

运行jupyter notebook出现这种情况的原因如何解决

运行jupyter notebook出现这种情况的原因如何解决

Jupyter Notebook 不会使用 pip 卸载软件包 [重复]

如何从终端运行 .ipynb Jupyter Notebook?