[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:003716] Re: narray-bigmem (narray plus over 2GB memory handling and thread parallel processing)



堀之内です。

自分でフォロー。

> ...計算に使うなら多次元配列は必須なわけですが,
> SciRuby での標準はどうなってるんですかね? NArray が基本
> なんでしょうか...。 

どうも NMatrix がそれ,としか考えようがないですね。
SciRubyサイトでは NMatrix が特にフィーチャーされてますし,
「rb-gsl fork replacing NArray with NMatrix」(ruby-gsl
の NMatrix 対応版)なんてのも作ってるそうなので
(see https://github.com/SciRuby/sciruby/blob/master/README.rdoc)。;

NMatrix は実際多次元にできるみたいです。行列のような行列で
ないような....  ちょっと試したので,レポートです:

horinout@hri7:~$ irb -r nmatrix -r pp
irb(main):001:0> nm = NMatrix.new( [2,3], (0..5).to_a )
=> #<NMatrix:0x007f4d99a7ad58 shape:[2,3] dtype:int32 stype:dense>
irb(main):002:0> pp nm

[
  [0, 1, 2]   [3, 4, 5] ]

new の第一引数は shape で,第二引数は値だそうです。
2行3列の「行列」のようです。すると,データの並びは列-行。
2次元配列とみなすと次元並びは C オーダー。

=> #<NMatrix:0x007f4d99a7ad58 shape:[2,3] dtype:int32 stype:dense>
irb(main):003:0> nm2 = NMatrix.new( [2,3], 3.0 )
=> #<NMatrix:0x007f4d99a851e0 shape:[2,3] dtype:float64 stype:dense>

これはすべての要素が 3.0 (float64) です。

irb(main):004:0> pp nm * nm2

[
  [0.0,  3.0,  6.0]   [9.0, 12.0, 15.0] ]
=> #<NMatrix:0x007f4d99a8de08 shape:[2,3] dtype:float64 stype:dense>
  
掛け算 (*演算子) は,行列のそれでなく二次元配列の要素別のそれに
なってます。自動型変換 (coearse) が行われてます。
ちなみに行列としての掛け算は dot メソッド(後述)。

次に3次元データを作ってみます。

irb(main):005:0> nm3 = NMatrix.new( [2,3,4], (0..23).to_a )
=> #<NMatrix:0x007f4d99a98f38 shape:[2,3,4] dtype:int32 stype:dense>
irb(main):006:0> pp nm3

{ layers:
  [
    [ 0,  4,  8]
    [12, 16, 20]
  ]

  [
    [ 1,  5,  9]
    [13, 17, 21]
  ]

  [
    [ 2,  6, 10]
    [14, 18, 22]
  ]

  [
    [ 3,  7, 11]
    [15, 19, 23]
  ]
}
=> #<NMatrix:0x007f4d99a98f38 shape:[2,3,4] dtype:int32 stype:dense>

やはり3次元配列とみなすと,次元は C オーダーです。
ただ,pp の出力をみると,2行3列の行列を4個並べたという
扱いみたいに見えます(長さ4の次元が最密なのが気持ち悪いですが...)。

行列(やベクトル)としての掛け算は dot メソッドです。

irb(main):009:0> nm.dot nm2
ArgumentError: incompatible dimensions
	from (irb):9:in `dot'
	from (irb):9
	from /opt/ruby2.1/bin/irb:11:in `<main>'

これは期待通り。2行3列同士では行列としての積はとれません。
そこで3行2列の行列を作って掛けてみます。

irb(main):010:0> nm4 = NMatrix.new( [3,2], 1.0 )
=> #<NMatrix:0x007f4d99ac7608 shape:[3,2] dtype:float64 stype:dense>
irb(main):012:0> nm.dot nm4
=> #<NMatrix:0x007f4d99ace9d0 shape:[2,2] dtype:float64 stype:dense>
irb(main):013:0> pp nm.dot(nm4)

[
  [ 3.0,  3.0]   [12.0, 12.0] ]
=> #<NMatrix:0x007f4d99ad3200 shape:[2,2] dtype:float64 stype:dense>

結果は(値も含めて)期待通りです。

次に shape=[2,3,4] で作った nm3 とかけてみます。先ほどの予想通り
2行3列の行列4個の並びという扱いであるとすると,nm3.dot nm4 の結果は
2行2列の行列が4個得られると期待されます。

irb(main):016:0> nm3.dot nm4
=> #<NMatrix:0x007f4d99ae1620 shape:[2,2] dtype:float64 stype:dense>
irb(main):017:0> pp nm3.dot(nm4)

[
  [ 3.0,  3.0]   [12.0, 12.0] ]
=> #<NMatrix:0x007f4d99ae9dc0 shape:[2,2] dtype:float64 stype:dense>

「掛けられる」いう点では期待どおりでしたが(2次元の
NMatrix 同士の dot メソッドでは,形的に行列として掛けら
れない場合は例外があがります),結果は行列が一個だけで値も妙です
(  [  [ 0,  4,  8]  [12, 16, 20] ] との掛け算になってない)。
おそらく,行列としての掛け算はあくまで2次元同士しかサポート
してないけど3次元のが掛けられてしまうので,ここでは例外処理
すべきなのにできてないというバグだと推測されます。

とりあえず。

--
> 堀之内です。
> 
> 佐々木さん,どうもです。(rbenvの件も)
> 
> > SciRuby には
> > 
> >   NArray fork with NMatrix:
> >   https://github.com/SciRuby/narray
> > 
> > というのもありますよ, というお知らせまでに. 
> 
> よくわかってないのですが,ググってみつかった
> https://github.com/SciRuby/nmatrix/issues/6
> からすると,NArray に NMatrix がある(NArray応用
> の行列ライブライとしてついてくる) というのを知らずに 
> SciRuby で NMatrix という同名のクラスを独立に作ってしまって,
> じゃあどうにか共存させられるようにしようとしたというところ
> でしょうか。
> 
> そのための基本的なアイディアは,NArray 付属の NMatrix
> を一段下げて NArray::NMatrix とするということのようですね。
> でもまだ開発初期段階のようで,
> 
>    gem install narray-nmatrix --pre
> 
> と --pre オプションをつけないと入らないようです
> (--pre は preliminary。narray-nmatrix というのが
> 「NArray fork with NMatrix compatibility」の gem 名(という?)
> の由)。
> 
> 実際入れてみるとまだ不具合があるようで,sciruby の nmatrix
> と共存できないようですが...。narray-nmatrix を入れると,
> ruby -r nmatrix と narray を require しないようにしても,
> NMatrix が使えなくなりました。ちなみに ruby 2.1.1 では
> (sciruby の) NMatrix も開発版でないと入りませんので,
> 
>    gem install nmatrix --pre
> 
> で入れました。
> 
> narray-nmatrix は基本的に NArray そのものみたい
> です。次元の並びもそのままで, 2G 個越えサポートなしも
> そのまま。
> 
> SciRuby の NMatrix は NArray の上に築かれてるわけではなく,
> 独立のようです。計算に使うなら多次元配列は必須なわけですが,
> SciRuby での標準はどうなってるんですかね? NArray が基本
> なんでしょうか...。 上のようなことを考えると NArray は
> あまり重視されてないように感じるのですが。
> 
> ...どなたかおわかりでないですか?
> 
> # というわけで,西澤さんの bigmem 版も,NMatrix の 
>    NArray::NMatrix 化すれば SciRuby と仲良くできるかも。
> 
> > 西澤様: 佐々木です.
> > 
> > At Tue, 18 Mar 2014 19:08:34 +0900,
> > Seiya Nishizawa <seiya@xxxxxxxxxxxxxx> wrote:
> > > 
> > > 本体は、"今後旧版 NArray の開発は行われません" と宣言がなされているので、
> > > 合流する予定は今のところはありません。
> > 
> > 了解です.
> > 
> > > 特にちゃんと考えていないので、どうするのが良いのか今後考えて行く必要が
> > > あろうかと思います。
> > 
> > SciRuby には
> > 
> >   NArray fork with NMatrix:
> >   https://github.com/SciRuby/narray
> > 
> > というのもありますよ, というお知らせまでに. 
> > 
> > > 2014年3月18日 18:37 Youhei SASAKI <uwabami@xxxxxxxxxxxxxx>:
> > > > 西澤様: 佐々木です.
> > > >
> > > > At Tue, 18 Mar 2014 11:41:25 +0900,
> > > > Seiya Nishizawa <seiya@xxxxxxxxxxxxxx> wrote:
> > > >>
> > > >> 本家 narray からフォークして、
> > > >> 2GB以上のメモリの扱い、
> > > >> および opnemp を使ったスレッド並列
> > > >> を追加した
> > > >> narray-bigmem を作りました。
> > > >>
> > > >> https://github.com/seiya/narray-bigmem
> > > >>
> > > >> いくつかはテストしていますが、
> > > >> まだ問題が残っている可能性があります。
> > > >
> > > > これは本体に合流する予定はありますか?
> > 
> > ---
> > Youhei SASAKI, Ph.D.
> > Department of Mathematics, Kyoto University
> > E-mail: <uwabami@xxxxxxxxxxxxxx>
> >         <uwabami@xxxxxxxxxxxxxxxxxx>
> > GPG fingerprint:
> >   4096/RSA: 66A4 EA70 4FE2 4055 8D6A C2E6 9394 F354 891D 7E07