我最近在Julia转移了我的代码。我想知道如何在命令行中执行Julia代码?
我知道可以通过运行一次来编译Julia代码。
但问题是我需要在集群上为我的仿真模型进行参数扫描,在那里我只能使用命令行 - 而不是REPL。
在群集上运行模拟复制的最佳做法是什么?
答案 0 :(得分:5)
只需使用命令行调用脚本:
julia myscript.jl
但问题是我需要为集群上的模拟模型进行参数扫描,我只能使用命令行。
我认为使用Julia的内置并行性最容易。 pmap
通常可以解决问题。如果您正在求解微分方程DifferentialEquations.jl has a function which will parallelize your problem across a cluster及其内部实现uses pmap
。这也可以作为如何处理其他问题的良好参考。
然后,您所要做的就是调用Julia,这样它就可以访问所有核心。您可以通过传入machinefile轻松完成此操作:
julia myscript.jl --machinefile the_machine_file
每当您创建批处理作业时都会生成计算机文件(对于某些集群,有时您需要启用MPI才能显示计算机文件)。有关详细信息,请参阅this blog post。
答案 1 :(得分:1)
Julia使用JIT compilation,无论您是在命令行还是在REPL或计算群集上执行Julia。
运行代码一次编译再次运行是否有问题?您始终可以使用小型模型或数据集编译代码,然后在完整数据集上运行已编译的代码。
如果您在一个节点上运行,那么您可以编写一个包含所有执行代码的函数(例如my_sim()
),然后将您的复制作为一个预定作业串行运行。第一次调用my_sim()
会编译所有代码,后续调用运行得更快。
如果您在多个节点上运行,请仔细考虑如何分配作业;也许您可以在组中测试参数设置,并将每个组分配给自己的节点,然后在每个节点上执行my_sim()
。
答案 2 :(得分:1)
忘记提到我已经设法从群集上的命令行运行Julia。
在PBS作业脚本中,您可以添加julia run_mytest.jl $parameter
。在run_mytest.jl
中,您可以添加
include("mytest.jl")
arg = parse(Float64, ARGS[1])
mytest(arg)
答案 3 :(得分:0)
假设您要实现的目标如下:
#!/usr/bin/env julia
或类似代码)的.jl文件。./mycode.jl
来打击bash。)正如其他人所指出的那样,我认为最常见的做法是实现工作负载等参数/分配的循环。都在朱莉娅内。但如果您想按上述方法进行操作,可以使用以下小技巧:
#!/ usr / bin / env julia
使用mymodule
mymainfunction(参数)
__precompile__()
添加到模块文件来预编译模块(有关详细信息,请参阅Julia Manpages)这样,在每台机器调用一次代码后,预编译对象就可用,将上述开销有效地减少到零。
答案 4 :(得分:0)
请在下面找到最佳实践,以在Julia HPC群集上运行参数扫描。 我讨论了三个问题:(1)计算仿真体系结构(2)集群设置(3)预编译。
计划仿真架构,第一步要考虑每个扫描值的计算时间差异
pmap
。另一个不错的选择是@parallel
循环。pmap
和@parallel
只是将任务平均分配给所有工作人员。因此,执行时间将是最长的工作人员完成所有已分配工作的时间。 因此,对于异构计算时间,您需要:
workers()
上进行迭代)ParallelDataTransfer.jl
向主控器轮询下一个参数扫描值(当然,某些外部数据库可用于此目的)。 在HPC环境中,群集设置的最佳选择是ClusterManagers.jl
-像超级按钮一样工作,并且支持您提到的PBS。该库将执行适当的PBS群集管理器命令,以将节点添加到Julia群集中。简单,高效且易于使用。其他人建议的--machinefile
选项非常方便,但是需要无密码的SSH,该密码通常在大多数HPC群集(除非它是公共云中的群集)上通常不可用(或不容易配置),对于AWS或Azure,我肯定会建议--machinefile
)。
请注意,由于硬件架构不同,在某些HPC群集(例如Cray)中,您可能需要分别为访问和工作节点构建Julia。幸运的是,Julia并行化工作在异构环境中没有任何问题。
最后但并非最不重要的一点是,您可以始终使用群集管理器来运行单独的Julia进程(网格计算/阵列计算作业)。但是,如果计算时间是异构的,这将变得很复杂(请参见前面的注释)。
我不建议预编译。在大多数数值模拟方案中,单个过程将在10分钟到几天之间的任何时间运行。将编译时间减少10-20秒是不值得的。但是,说明如下:
步骤包括:
yourimage.jl
文件:
Base.require(:MyModule1)
Base.require(:MyModule2)
$ julia /path/to/julia/Julia/share/julia/build_sysimg.jl /target/image/folder native yourimage.jl
INFO: System image successfully built at /target/image/folder/yourimage.so
INFO: To run Julia with this image loaded, run: `julia -J /target/image/folder/yourimage.so`.
-J
选项运行Julia 每当您自己或外部软件包中的某些内容发生变化时,您都需要重复上述四个步骤。