[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)
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:003716] Re: narray-bigmem (narray plus over 2GB memory handling and thread parallel processing)
- From: Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>
- Date: Tue, 18 Mar 2014 23:42:20 +0900
堀之内です。
自分でフォロー。
> ...計算に使うなら多次元配列は必須なわけですが,
> 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