ボイラーのチラシ裏

テクノロジーやフィギュア、ゲームに関すること

【C#】Numpy✕CuPyのハイブリッド.NETライブラリを作った(仮)

こんばんは。

最近作業の進捗が悪いというか、

いやね、作業はしているんですが

スムーズに事を運ぶことができなくて

悶々としている日々を送っています。

今週のテーマ

先週CuPyをラップした.NET版ライブラリ「CuPy.NET」を軽く紹介しました。

ここにSciSharpさんのNumpy.NET と CuPy.NET が揃ったので

スイッチひとつでどちらを使用するか切り替えられるライブラリを作りたくなりました。

で、作ったわけなんですが、ちゃんとパッケージングできていなくて

現在開発中のDeZero.NETパッケージに成果物を含めてしまっています。

まあ、これは完全に私の都合でなんですが、将来的には分蜂したいですね。

というわけで、今回はDeZero.NETパッケージに居候しているxp静的クラスについてご紹介。

xpってなんだ...?と思われた方。

ぜひ「ゼロから作るDeepLearning③ フレームワーク編」を読んでみてください。

C#におけるxp静的クラスはNumpyのnp静的クラスとCuPyのcp静的クラスをハイブリッドした表現です。

実際にコードを見てみましょう。

using Python.Runtime;

namespace DeZero.NET.Tests
{
    public class AddTests
    {
        [OneTimeSetUp]
        public void OneTimeSetUp()
        {
            Runtime.PythonDLL = @"C:\Users\boiler\AppData\Local\Programs\Python\Python311\python311.dll";
            PythonEngine.Initialize();
            Core.UseGpu = true;
        }

        [Test]
        public void Test_Forward1()
        {
            var x0 = xp.array([1, 2, 3]);
            var x1 = new Variable(xp.array([1, 2, 3]));
            var y = x0 + x1;
            var res = y.Data;
            var expected = xp.array([2, 4, 6]);
            Assert.That(res, Is.EqualTo(expected));
        }

        [Test]
        public void Test_DataType()
        {
            var x = new Variable(xp.array(2.0));
            var y = x.pow(2);
            Assert.That(xp.isscalar(y.Data.Array), Is.False);
        }

        //続きは作成中...
    }
}

前提として、以上のテストコードはすべて成功します。

xpクラスはnpクラスやcpクラスのようにほぼ互換のある書き方で使用できます。

(まあ正確にいうと、CuPyはNumpyの機能をすべてサポートしているわけではないので、そのへんはxpクラスで調整していますが。詳しくは以下リンクをご覧ください。)

docs.cupy.dev

OneTimeSetUpで Core.UseGpu = true; みたいな書き方をすれば、npクラスを使用するデフォルトの振る舞いをcpクラスを使用するように変更できます。

次回予告

xpクラスは一応一通り実装は済んでいて、

次のステップ「xpクラスを使用してDeZeroを.NETコードで作る」ステップに移っています。

来週末は本業がちょっと忙しいので、記事執筆はおやすみします。

再来週までにDeZero.NETを作れたら、私は天才です。

ですが、それを達成するのは現実的ではなく、たぶん間に合わないでしょう。

再来週の記事はDeZero.NETの開発途中経過報告回とでもしましょうか。