14
1

More than 1 year has passed since last update.

この記事で、@zacky1972 さんから、defnには最適化高速化の効果もある。とコメントいただきました。
kino_bencheeも使ってみたかったので、勉強も兼ねてやってみます。

速度比較結果

image.png

defn、compiler指定無し(青色)でも速くなってます。
Nx.Defn.jit(dot_fn, compiler: EXLA)でjitコンパイルした場合(オレンジ色)は飛びぬけて速い!

default_defn_optionscompiler: EXLAを指定しておけば、デフォルトのcompileがEXLAになります。
defnで記述するだけで、この効果が得られます。
compiler: EXLAをつけましょう!効果は絶大です

import Config
config :nx, :default_backend, EXLA.Backend
config :nx, :default_defn_options, compiler: EXLA

この例は、jitでコンパイルしましたが、defnで記述した場合も同じ効果が得られるとおもいます。
そういえば、Axonのコードを実行する場合、この記述を付ける事でかなり速くなってました。この働きですね。

以下は、測定した時のlivebookです

速度比較のlivemd

Mix.install(
  [
    {:nx, "~> 0.3.0"},
    {:exla, "~> 0.3.0"},
    {:kino, github: "livebook-dev/kino", branch: :main, override: true},
    {:kino_benchee, "~> 0.1", github: "livebook-dev/kino_benchee", branch: "main"}
  ],
  config: [
    nx: [
      default_backend: EXLA.Backend
      # default_defn_options: [compiler: EXLA] #比較kのためデフォルトでは無効にする
    ]
  ],
  system_env: [
    XLA_TARGET: "cuda111"
  ],
  # XLA_TARGETの変更で、exlaを再コンパイルしたい時はtrueにする
  force: true
)

速度比較

dot_fn = fn ->
  a = Nx.random_uniform({100, 100})
  b = Nx.random_uniform({100, 100})
  Nx.dot(a, b)
end

dot_jit = Nx.Defn.jit(dot_fn)
dot_jit_exla = Nx.Defn.jit(dot_fn, compiler: EXLA)

Benchee.run(
  %{
    "def" => dot_fn,
    "Nx.Defn.jit" => dot_jit,
    "Nx.Defn.jit_exla" => dot_jit_exla
  },
  time: 10,
  memory_time: 2
)

参考
https://qiita.com/zacky1972/items/c8deaf2413efa726ea79
https://qiita.com/RyoWakabayashi/items/afbd4d2187368346d5a9

14
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
1