实验测井工具
cox的Python项目详细描述
cox:一个实验设计与分析框架
您可以在cox
上找到api文档,以及
在下面穿行。
简介
cox是一个轻量级的、无服务器的框架,用于设计和管理 实验。灵感来自于我们自己在基于特定文件系统的斗争中 实验收集,以及我们无法使用重型框架,cox aims 成为一个最小的负担,同时诱导更多的组织。由logan创建 engstrom和andrew 伊利亚斯
cox的工作原理是帮助您轻松地登录,收集,以及 分析实验结果。有关API文档,请参见此处的 提供演示Cox最重要功能的演练。
为什么叫"考克斯"?(旁白):考克斯的名字来源于
舵手
以划船船员的身份驾驶船只,并以格特鲁德的名字命名。
实验先驱考克斯
设计。
Cox可以通过PYPI安装为: cox需要python 3,并且已经用python3.7进行了测试。 cox测井系统是为处理重复实验而设计的。这个
用户为熊猫定义模式
数据帧安装
pip3 install cox
引文
@unpublished{cox,
title={Cox: A Lightweight Experimental Design Library},
author={Logan Engstrom and Andrew Ilyas},
year={2019},
url={https://github.com/MadryLab/cox}
}
快速日志概述
交互式介绍
在我们的机器学习工作中,我们大部分使用cox,但是cox对类型或 您编写的代码的样式。为了说明这一点,我们经历了 演练中的简单示例。
演练1:登录cox
注意1:您可以在这里的示例文件中查看此运行示例的所有组件!
注意2:本演练的副本也可与我们的API一起提供 文档,这里
在本演练中,我们将从以下简单的代码开始, 它试图找到二次函数的最小值:
importsysdeff(x):return(x-2.03)**2+3x=...tol=...step=...for_inrange(1000):# Take a uniform step in the direction of decreaseiff(x+step)<f(x-step):x+=stepelse:x-=step# If the difference between the directions# is less than the tolerance, stopiff(x+step)-f(x-step)<tol:break
初始化存储
登录cox是通过store
类完成的,该类可以创建如下:
fromcox.storeimportStore# rest of program here...store=Store(OUT_DIR)
构造时,store
实例创建一个带有随机的uuid的目录
生成名inout_dir
,ahdfstore
用于存储数据,一些日志
文件和一个tensorboard目录(名为tensorboard
)。因此,在运行此命令之后,我们的out目录应该如下所示:
$ ls OUT_DIR 7753a944-568d-4cc2-9bb2-9019cc0b3f49 $ ls 7753a944-568d-4cc2-9bb2-9019cc0b3f49 save store.h5 tensorboard
实验id字符串7753a944-568d-4cc2-9bb2-9019cc0b3f49
自动生成。如果我们想把实验命名为别的,我们可以通过
它作为第二个参数;即使用store(out_dir,'exp1')
将使相应的实验idexp1
创建表格
下一步是声明我们要通过表存储的数据。我们可以添加 根据我们的需要任意表,但是我们需要指定构架 提前传递模式。在我们的例子中,我们将从 包含用于运行 上面的程序,以及用于写入结果的表格:
store.add_table('metadata',{'step_size':float,'tolerance':float,'initial_x':float,'out_dir':str})store.add_table('result',{'final_x':float,'final_opt':float})
每个表都与hdfstore
中的apandas数据框完全对应。
对象:< /P>
关于序列化的说明
cox支持基本对象类型(如float
、int
、str
等)以及
一种可序列化的对象(通过dill或使用pytorch的序列化
方法)。特别是,如果我们想序列化一个对象,我们可以传递
以下类型:cox.store.[object pickle pytorch_state]
作为类型值
在架构字典中映射到的。cox.store.pytorch_state
是
特别适用于处理pytorch对象,如权重。
具体来说:对象
对应于将对象存储为
表中的序列化字符串,pickle
对应于将对象存储为
磁盘上的序列化字符串位于单独的文件中,并且pytorch\u state
对应于
使用torch.save
日志记录
现在我们有了一个表,我们可以给它写行了!登录cox是在 逐行方式:任何时候都可以附加一个工作行 to/updated;然后可以刷新行(即写入文件),然后开始 新的(空的)工作行。相关命令是:
# This updates the working row, but does not write it permenantly yet!store['result'].update_row({"final_x":3.0})# This updates it againstore['result'].update_row({"final_opt":3.9409})# Write the row permenantly, and start a new working row!store['result'].flush_row()# A shortcut for appending a row directlystore['metadata'].append_row({'step_size':0.01,'tolerance':1e-6,'initial_x':1.0,'out_dir':'/tmp/'})
使用"更新"行进行增量更新
后续更新行的调用将编辑同一工作行。 如果行的不同部分是用不同的 代码中的函数/位置,因为它不需要传递统计信息 到处都是。
读取数据
通过填充表行,我们实际上只是将行添加到底层
hdfstore
表。如果我们以后想看商店,我们可以再开一家
存储在同一位置,然后使用简单的命令读取数据帧:
# Note that EXP_ID is the directory the store wrote to in OUT_DIRs=Store(OUT_DIR,EXP_ID)# Read tables we wrote earliermetadata=s['metadata'].dfresult=s['result'].dfprint(result)
检查result
表,我们可以在pandas数据框中看到预期的结果!
final_x final_opt
0 3.000000 3.940900
collectionreader
:一次阅读许多实验
现在,在我们的二次示例中,我们不打算只尝试一组
参数,我们将尝试为步长设置许多不同的值,
公差
和初始x
,因为我们尚未发现凸优化。
要做到这一点,我们只需运行脚本多次
超参数,为所有运行提供相同的输出目录(调用
cox将自动在内部创建不同的命名文件夹
输出目录
用于每个实验。
假设我们已经这样做了(使用任何标准工具,例如slurm中的sbatch
,
sklearn
grid search等),我们有一个满是商店的目录(这个
这就是为什么我们使用uuid
s而不是手工挑选的名称!)
pip3 install cox0
现在,我们要从这个目录中收集所有结果。我们可以使用
cox.readers.collectionreader
以串联方式将所有表一起读取
熊猫
表。
pip3 install cox1
它将所有结果
表作为
pandas数据框便于操作:
pip3 install cox2
pandas
有大量强大的实用工具可用于搜索和
操作数据帧。我们建议查看他们的
DOCs<
关于如何做到这一点的信息。为了方便,我们给了一些简单的
以下示例:
pip3 install cox3
演练2:使用cox
和tensorboardx
注意:与第一个演练一样,一个工作示例文件包含 这些命令可以在这里找到
在这里,我们将展示如何将cox
和tensorboardx
一起用于日志记录。
我们将使用以下简单的运行示例:
pip3 install cox4
如前所述,cox.store
对象也会自动创建
tensorboard
通过
tensorboardx
图书馆。创建的cox.store.store
对象实际上是一个writer
属性
那是一个功能齐全的
摘要编写器
对象。这意味着我们可以在TensorBoard中绘制所需的线,如下所示:
pip3 install cox5
不幸的是,tensorboard数据很难通过方法读取/操作
而不是tensorboard接口。为了方便起见,存储对象
提供同时写入表和
tensorboardx
writer的能力
通过log_table_和_tb
函数的时间,这意味着我们可以替换
上面带有:
pip3 install cox6
使用cox.tensorboard查看多个tensorboard
注意:python-m cox.tensorboard_视图的cox tensorboard
来自命令行
继续我们的运行示例,我们现在可能希望直观地比较
在多个参数设置中使用tensorboard。幸运的是,考克斯
提供实用程序,用于在可读的
方式。在我们的示例中,我们创建了一个store
对象和一个表
调用了存储超参数的元数据。我们还演示了如何
通过tensorboardx
集成tensorboard日志。我们现在使用
cox.tensorboard视图
在
一次(这在比较网格搜索的参数时很有用)。
实现这一点的方法是通过cox.tensorboard_view
命令,它是
称为python3-m cox.tensorboard_view,参数如下:
--logdir
:(必需),所有存储所在的目录--端口
:(默认值6006),运行TensorBoard服务器的端口--元数据表
(默认"元数据"),其中
超参数被保存(即运行示例中的"元数据")。这个
应该是一个只有一行的表,如我们的运行示例所示。--filter param
(可选)可以多次使用,过滤掉存储
来自tensorboard聚合。对于表单的每个参数
--filter param param_name param_regex
,仅存储
元数据匹配param_regex
将被保留。--format str
(必需)如何显示店铺名称。回忆
默认情况下,每个商店都有一个生成的名称。这个论点
确定它们的名称将如何显示在TensorBoard中。花冠
表示参数值,uuid将始终附加到名称中。所以
在我们的运行示例中,--format str ss-{step_size}
将导致
带有ss-1.0-ed892c4f-069f-4a6d-9775-be8fdfce4713形式名称的张力板
所以在我们的运行示例中,如果我们运行以下命令,显示坡度
在张量板的名字和过滤之间的斜率n 1和3:
啊!
或
AAAAAAA 18
然后导航到localhost:6006
结果:
推荐PyPI第三方库
注意:python-m cox.tensorboard_视图的 继续我们的运行示例,我们现在可能希望直观地比较
在多个参数设置中使用tensorboard。幸运的是,考克斯
提供实用程序,用于在可读的
方式。在我们的示例中,我们创建了一个 实现这一点的方法是通过 所以在我们的运行示例中,如果我们运行以下命令,显示坡度
在张量板的名字和过滤之间的斜率n 1和3: 或 然后导航到cox tensorboard
来自命令行
store
对象和一个表
调用了存储超参数的元数据。我们还演示了如何
通过tensorboardx
集成tensorboard日志。我们现在使用
cox.tensorboard视图
在
一次(这在比较网格搜索的参数时很有用)。cox.tensorboard_view
命令,它是
称为python3-m cox.tensorboard_view,参数如下:--logdir
:(必需),所有存储所在的目录--端口
:(默认值6006),运行TensorBoard服务器的端口--元数据表
(默认"元数据"),其中
超参数被保存(即运行示例中的"元数据")。这个
应该是一个只有一行的表,如我们的运行示例所示。--filter param
(可选)可以多次使用,过滤掉存储
来自tensorboard聚合。对于表单的每个参数
--filter param param_name param_regex
,仅存储
元数据匹配param_regex
将被保留。--format str
(必需)如何显示店铺名称。回忆
默认情况下,每个商店都有一个生成的名称。这个论点
确定它们的名称将如何显示在TensorBoard中。花冠
表示参数值,uuid将始终附加到名称中。所以
在我们的运行示例中,--format str ss-{step_size}
将导致
带有ss-1.0-ed892c4f-069f-4a6d-9775-be8fdfce4713形式名称的张力板
localhost:6006
结果:推荐PyPI第三方库