如何在命令行中执行Julia代码?

时间:2017-02-03 17:50:01

标签: julia

我最近在Julia转移了我的代码。我想知道如何在命令行中执行Julia代码?

我知道可以通过运行一次来​​编译Julia代码。

但问题是我需要在集群上为我的仿真模型进行参数扫描,在那里我只能使用命令行 - 而不是REPL。

在群集上运行模拟复制的最佳做法是什么?

5 个答案:

答案 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)

假设您要实现的目标如下:

  • 在顶部有一个包含代码和一个shebang(#!/usr/bin/env julia或类似代码)的.jl文件。
  • 让另一个程序,bash等调用此代码(例如,通过调用./mycode.jl来打击bash。)
  • 但是每次调用代码时都要避免通过编译步骤,因为它会产生很大的开销。

答案:

正如其他人所指出的那样,我认为最常见的做法是实现工作负载等参数/分配的循环。都在朱莉娅内。但如果您想按上述方法进行操作,可以使用以下小技巧:

  • 提取所有必须编译成模块的代码。
  • 因此要调用的实际文件缩小为
  

#!/ usr / bin / env julia

     

使用mymodule

     

mymainfunction(参数)

  • 通过将__precompile__()添加到模块文件来预编译模块(有关详细信息,请参阅Julia Manpages

这样,在每台机器调用一次代码后,预编译对象就可用,将上述开销有效地减少到零。

答案 4 :(得分:0)

请在下面找到最佳实践,以在Julia HPC群集上运行参数扫描。 我讨论了三个问题:(1)计算仿真体系结构(2)集群设置(3)预编译。

  1. 计划仿真架构,第一步要考虑每个扫描值的计算时间差异

    • 如果计算时间的方差很小,则建议使用pmap。另一个不错的选择是@parallel循环。
    • 但是,如果计算时间差异较大,则不建议使用这些选项。 pmap@parallel只是将任务平均分配给所有工作人员。因此,执行时间将是最长的工作人员完成所有已分配工作的时间。

    因此,对于异构计算时间,您需要:

    • 在主进程上存储作业号(或参数扫描值)
    • 使用@spawnat在从属进程上启动循环(只需在workers()上进行迭代)
    • 有从属进程使用ParallelDataTransfer.jl向主控器轮询下一个参数扫描值(当然,某些外部数据库可用于此目的)。
  2. 在HPC环境中,群集设置的最佳选择是ClusterManagers.jl -像超级按钮一样工作,并且支持您提到的PBS。该库将执行适当的PBS群集管理器命令,以将节点添加到Julia群集中。简单,高效且易于使用。其他人建议的--machinefile选项非常方便,但是需要无密码的SSH,该密码通常在大多数HPC群集(除非它是公共云中的群集)上通常不可用(或不容易配置),对于AWS或Azure,我肯定会建议--machinefile)。

    请注意,由于硬件架构不同,在某些HPC群集(例如Cray)中,您可能需要分别为访问和工作节点构建Julia。幸运的是,Julia并行化工作在异构环境中没有任何问题。

    最后但并非最不重要的一点是,您可以始终使用群集管理器来运行单独的Julia进程(网格计算/阵列计算作业)。但是,如果计算时间是异构的,这将变得很复杂(请参见前面的注释)。

  3. 我不建议预编译。在大多数数值模拟方案中,单个过程将在10分钟到几天之间的任何时间运行。将编译时间减少10-20秒是不值得的。但是,说明如下:

    步骤包括:

    1. 使用以下内容创建yourimage.jl文件: Base.require(:MyModule1) Base.require(:MyModule2)
    2. 运行 $ julia /path/to/julia/Julia/share/julia/build_sysimg.jl /target/image/folder native yourimage.jl
    3. 等待与此类似的消息 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`.
    4. 按照说明操作,并使用-J选项运行Julia

    每当您自己或外部软件包中的某些内容发生变化时,您都需要重复上述四个步骤。