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

如何在命令行中执行Julia代码?,julia,Julia,我最近一直在转移我在朱莉娅的代码。我想知道如何在命令行中执行Julia代码 我知道Julia代码只需运行一次就可以完成 但问题是我需要在集群上为我的仿真模型做参数扫描,在集群中我只能使用命令行,而不能使用REPL 在集群上运行模拟复制的最佳实践是什么?Julia使用的是独立于是否在命令行、REPL或计算集群上执行Julia的 一次运行代码进行编译,一次运行代码以提高性能是否有问题?您可以始终使用一个小模型或数据集编译代码,然后在完整的数据集上运行编译后的代码 如果在一个节点上运行,则可以编写包含

我最近一直在转移我在朱莉娅的代码。我想知道如何在命令行中执行Julia代码

我知道Julia代码只需运行一次就可以完成

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

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

Julia使用的是独立于是否在命令行、REPL或计算集群上执行Julia的

一次运行代码进行编译,一次运行代码以提高性能是否有问题?您可以始终使用一个小模型或数据集编译代码,然后在完整的数据集上运行编译后的代码

如果在一个节点上运行,则可以编写包含所有执行代码的函数(例如,
my_sim()
),然后作为一个计划作业串行运行复制。第一次调用
my_sim()
会编译所有代码,随后的调用运行得更快


如果您在多个节点上运行,那么仔细考虑如何分配作业;也许您可以分组测试参数设置,并将每个组分配到自己的节点,然后在每个节点上执行

my_sim()

只需使用命令行调用脚本:

julia myscript.jl
但问题是我需要在集群上为我的仿真模型进行参数扫描,在集群中我只能使用命令行

我认为使用Julia内置的并行性是最容易的<代码>pmap通常起作用。如果你在解微分方程,以及它的内部实现。这也可以作为处理其他问题的很好的参考

然后你所要做的就是给Julia打电话,这样它就可以访问所有的内核。您可以通过传入machinefile轻松完成此操作:

julia myscript.jl --machinefile the_machine_file

每当创建批处理作业时都会生成机器文件(对于某些集群,有时需要启用MPI以显示机器文件)。有关更多信息,请参阅。

假设您试图实现以下目标:

  • 在顶部有一个包含代码的.jl文件和一个shebang(
    #!/usr/bin/env julia
    ,或类似文件)
  • 让另一个程序、bash等调用此代码(例如,在bash中调用
    /mycode.jl
  • 但是避免每次调用代码时都执行编译步骤,因为这会产生大量开销
答复: 正如其他人所指出的,我认为julia nique实现这一点的最有效的方法实际上是在julia内部进行参数循环/工作负载分配/等等。但是,如果您想按照上述方法进行操作,可以使用以下小技巧:

  • 提取所有必须编译到模块中的代码
  • 因此,要调用的实际文件减少到
#!/usr/bin/env julia

使用mymodule

MyMain函数(ARGS)

  • 通过向模块文件中添加
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
    使模块预编译(有关此方面的更多信息,请参阅)

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

忘了提到我已经设法从集群上的命令行运行了Julia

在PBS作业脚本中,可以添加
julia run\u mytest.jl$参数
。在
run_mytest.jl
中,您可以添加

include("mytest.jl")
arg = parse(Float64, ARGS[1])
mytest(arg)

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

<> >规划仿真体系结构,第一步考虑每个扫描值

计算时间的方差
  • 如果计算时间的差异很小,您可以使用建议的
    pmap
    。另一个很好的选择是
    @并行
    循环
  • 但是,如果计算时间的差异很大,则不建议使用这些选项
    pmap
    @parallel
    只需将任务平均分配给所有员工即可。因此,执行时间将是工人完成分配的所有作业所花费的最长时间
因此,对于异构计算时间,您需要:

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

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

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

  • 我不建议预先编译。在大多数数值模拟中