Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる 19日目 バイナリをさらすには①

# ソフトウェアは実行できてナンボ
ソフトウェアは実行できなければ意味がない。誰でも使える**実行ファイルを提供できるのはC++の醍醐味**。ダウンロードして何も考えず起動できる体験はバイナリならではだろう。昔は開発環境に付いてくるライブラリくらいしか使わなかったので、気軽にバイナリを晒せたが、OSSをふんだんに使う今はそうもいかない。一つ一つ再配布条件を調べておく。

※結論からいうと、ライセンスが問題になるのはLibtorchとOpenCVとcocoだった。せっかくなので調べた内容はそのまま残しておく。

# Visual Studio
Visual Studioで開発したソフトには、Visual C++ のDLLが必要である。ビルドの出力フォルダを見たところ、それに該当しそうなDLLは入っていない。Visual C++ 再頒布可能パッケージというのが公開されているので、それをインストール先で入れてください、ということになっている。とにかく問題なさそうな感じである。
https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170

# Libtorch
本ソフトはLibtorchを使っている。ビルドの出力フォルダにもlibtorchのdllが入っている。再領布はできるのだろうか。[Wikipedia](https://ja.wikipedia.org/wiki/PyTorch)によるとPytorch/Libtorchは[BSDライセンス](https://ja.wikipedia.org/wiki/BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9)で提供されていると書かれている。公式を確認すると、再配布に関する条件はここ↓に書いてあった。
https://github.com/pytorch/pytorch/blob/main/LICENSE
長いので要点だけ訳すと
>以下の条件が満たされる場合、修正の有無に関わらず、ソースおよびバイナリ形式での再配布と使用が許可されます：
>1. ソースコードの再配布は上記の著作権通知、この条件リスト、および以下の免責事項を保持しなければなりません。
>2. バイナリ形式での再配布は上記の著作権通知、この条件リスト、および配布された文書および/またはその他の資料にこの免責事項を再生しなければなりません。
>3. Facebook、Deepmind Technologies、NYU、NEC Laboratories America、IDIAP研究所の名前およびその貢献者の名前は、このソフトウェアから派生した製品を推奨または宣伝するために、特定の事前の書面による許可なしに使用してはなりません。

なるほどBSDライセンスである。要するに、これまで蓄積された著作権を全て明記し、かつ、開発者にいかなる責任も無いことを明記すればいい。このライセンスファイルの内容をそのままコピーしておけばいいのだろう。条件さえ整えれば再配布は可能なようだ。

# onnxruntime
ビルドの出力フォルダを見るとonnxruntime.dllなどのdllが含まれている。これの配布条件はここに書いてある。
https://github.com/microsoft/onnxruntime/blob/main/LICENSE
これを訳すと、
>MITライセンス
著作権 (c) Microsoft Corporation
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、以下の条項を条件として、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 
>* 本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそのことを許可すること。
>* 上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。
>* ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。
>* いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。 

MITライセンスとある。BSDと同じような感じだ。これも条件さえ整えれば再配布は可能なようだ。

同じ[githubのフォルダ](https://github.com/microsoft/onnxruntime)を見ると[CODEOWNERS](https://github.com/microsoft/onnxruntime/blob/main/CODEOWNERS)と[ThirdPartyNotices.txt](https://github.com/microsoft/onnxruntime/blob/main/ThirdPartyNotices.txt)というファイルがある。特にThirdPartyNotices.txtには訳さず添付しろと書いてあるので、これらのファイルも付けといたほうが良いようだ。

# OpenCV
ビルドの出力フォルダを見るとOpenCVのdllがある。自分でビルドしたものだが、これのライセンスはどうなっているのか? やはり[配布元](https://github.com/opencv/opencv)を確認する。[COPYRIGHT](https://github.com/opencv/opencv/blob/4.x/COPYRIGHT)と[LICENSE](https://github.com/opencv/opencv/blob/4.x/LICENSE)というファイルがある。COPYRIGHTには著作権者が羅列してある。LICENSEには詳しく権利について記述されている。[Apache License 2.0]に準拠しているようだ。権利条項にも著作権がありそうなので、条項ごとの要件だけメモとして書いておく。
>1. 言葉の定義。「二次著作物」や「寄稿者」などの言葉の定義。
>2. 各プログラム作成者には、複製、派生作品の作成、公に展示、公の公演、 サブライセンスを付与し、作品およびその派生作品をソースまたはオブジェクト形式で配布する権利を与えると、ある。
>3. 特許も取っていいとのこと。ただし特許侵害した場合はすべての権利を失う。
>4. 再配布の条件。ソースを改変した場合は、改変したソースを公開せよ、と読める。ソースを全部付けろ、とは書いていないようだ。
>5. OpenCVに新たにコードを加えたときのライセンス条件か。
>6. 商標について。
>7. 免責事項。
>8. 責任の制限。免責事項と同じような感じ。
>9. 保証について。フリーソフトの配布には関係ないだろう。

> 付録
>Apache 制作した作品(your work)に付与する具体的な方法。

オープンと謳っている割には条件が多いような気がするが、商利用を見据えてるのだろう。これも条件さえ整えれば再配布は可能なようだ。

# Yolo、coco
Yoloのコードは特に含まれないが、cocoの学習済みモデルは添付したいところである。自作の学習モデルもあるが会社で作ったものなのでこれは配れない。cocoのライセンスについてはここに書いてある。
https://cocodataset.org/#termsofuse
[Creative Commons Attribution 4.0 License.](https://creativecommons.org/licenses/by/4.0/legalcode)に準拠するとのこと。クレジットを表示すれば自由に使えるライセンスである。再配布は可能なようだ。

# cuda
GPUバージョンには大量のcuda関係のdllが必要になる。cuda toolkitに関するライセンスはここに書いてある。
https://docs.nvidia.com/cuda/eula/index.html
何だか非常にややこしい。再配布のところを訳すと

>SDKをオープンソースソフトウェアライセンスの対象となるような方法で使用することはできません。例として、使用、変更、および／または配布の条件としてSDKが以下のようになることを要求するライセンスが挙げられます：
>a. ソースコード形式で公開または配布されること。
>b. 派生作品を作成する目的でライセンスされること。
>c. 無償で再配布可能であること。

一見、ダメなのかイイのか判りにくい表現である。よく読むと **オープンソースソフトウェアライセンスの対象となるような方法はダメ** で、**派生作品や無償の再配布** はイイということのようだ。「無償の再配布」の英語は「Redistributable at no charge」である。

> 2.2. 配布
本契約に基づいて配布可能な SDK の部分は、添付 Aにリストされています。

Attachment Aには下記の記述がある。
>あなたによって開発されたライセンシーのアプリケーションと共に配布され得る以下のCUDAツールキットファイルがあります。これにはファイル名にバージョン番号やアーキテクチャ固有の情報が埋め込まれている特定のバリエーションのファイルも含まれます。例示のみとして、64ビットWindowsソフトウェアのリリースバージョン9.0については、ファイル「cudart64_90.dll」が再配布可能です。

この文章にしたに配布可能なdllがリストされている。記載されているのは頭の部分と拡張子だけで、バージョンで変わる部分は省略されている。「64」や「90」などは環境によって変わるので、それらの付いたファイルも配ってもいいよ、ということだろう。問題は「契約」という表現である。

多少リスクはあるが、このページの英文を全部ChatGPT4に読み込ませて聞いてみた。

>You
SDKで作った二次制作物のバイナリを配布する場合、作成者はNvidiaとどのような契約をすべきですか
>
>ChatGPT
文書によると、SDKを使用して作成された二次制作物（例えば、SDKのサンプルソースコードから派生したアプリケーションやサービス）のバイナリを配布する場合、作成者はNVIDIAとの間に特定の契約を結ぶ必要はありませんが、以下の条件を満たす必要があります：
>1. ライセンス契約の遵守： 作成者は、このエンドユーザーライセンス契約（EULA）の条件に従う必要があります。これには、バイナリがSDKの配布可能な部分を含む場合、その配布に関する特定の要件が含まれます。
配布の要件： 配布されるアプリケーションは、SDKに含まれる部分以上の実質的な追加機能を持っている必要があります。SDKの配布可能な部分は、作成者のアプリケーションによってのみアクセスされるべきです。
>2. 著作権表示： サンプルソースコードの変更や派生作品を配布する場合、NVIDIA Corporationから提供されたソースコードを含むことを示す通知を含める必要があります。
>3. クリティカルアプリケーション： SDKを使用して開発された製品やサービスがクリティカルアプリケーションで使用される場合、NVIDIAとの特別な契約が必要になる可能性があります。これには、人命の安全に関わるシステムでの使用や壊滅的な損害をもたらす可能性があるシステムが含まれます。
>4. オープンソースライセンスの適用回避： SDKを使用して開発された製品やサービスがオープンソースソフトウェアライセンスの対象とならないようにする必要があります。具体的には、SDKがソースコード形式で公開されたり、派生作品を作成する目的でライセンスされたり、無償で再配布されることを要求するライセンスの対象にならないようにしなければなりません。
>
>作成者がこれらの条件を遵守する限り、NVIDIAとの間で追加の契約を結ぶ必要はありません。ただし、EULAの全条文を注意深く読み、すべての条件が遵守されていることを確認し、必要であれば法的なアドバイスを求めることをお勧めします。

では具体的にどんなものを添えればいいのか。これもGPT先生に聞いてみる。

>You
バイナリを再配布する場合、どんな条文を書くべきですか。どんなものを添付すべきですか。
ChatGPT
バイナリを再配布する場合、以下のような条文を記載するべきです。これは、文書に記載されているライセンス条件に基づいた一般的なガイドラインです：
>1. 著作権通知： 再配布されるバイナリには、元のソフトウェアの著作権通知を含める必要があります。例えば「このソフトウェアにはNVIDIA Corporationから提供されたソースコードが含まれています。」
>2. ライセンスのコピー： 再配布されるバイナリには、エンドユーザーライセンス契約（EULA）のコピーを含める必要があります。これにより、エンドユーザーが使用条件を理解し、同意することができます。
>3. 改変の通知： もしオリジナルのソースコードを改変した場合、その改変を明確に示す通知を改変されたファイルに含める必要があります。
>4. 配布要件の遵守： 再配布されるバイナリがSDKの配布可能な部分を含む場合、それらの部分はあなたのアプリケーションによってのみアクセスされること、またSDKを単独製品として配布またはサブライセンスしないことを明記する必要があります。
>5. ライセンスの条文と一致： あなたのアプリケーションのライセンス条文は、このEULAの条文と一致している必要があります。これには、NVIDIAの知的財産権の保護に関連する条件が含まれます。
>6. 免責事項と制限： 再配布されるバイナリには、ソフトウェアが「現状のまま」提供され、いかなる明示的または暗黙的な保証もされていないことを示す免責事項を含める必要があります。
>
>これらの条文は、あなたが再配布するバイナリが適切にライセンスされ、エンドユーザーに対して責任ある方法で提供されることを保証するために重要です。再配布に際しては、EULAの全条文と添付されている付録やその他の参照資料をよく読み、遵守していることを確認してください。また、具体的なライセンス条件や法的なアドバイスが必要な場合は、法律専門家に相談することが望ましいです。

これも条件さえ整えれば再配布は可能なようだ。

# 結局要るのは
ここまで書いて、実行ファイル群を整理していたら結局使っているDLLはopencvとlibtorchだけだった。onnxruntimeとcudaのdllは使っていない。ライセンスのややこしいcudaは関係ない、ということでだいぶ心配事が無くなった。

つづく