ステライメージ9で画像処理の高速化を担当しました、ソフトウェア開発部のつのだです。
そもそも私がこの会社に入ったきっかけは国立天文台で無償提供されているすばる画像解析ソフト・マカリに触れたことでした。恥ずかしながら、このソフトがアストロアーツが開発したものであると知ったのは働き始めた後でした。
ステライメージ8の発売直後の入社だったため、ここ数年間は画像処理と無縁の仕事が続いていましたが、その間も虎視眈々と処理の高速化を温めていました。
高速化のひみつ
ステライメージは1997年発売から今に至る歴史の長い天体画像処理ソフトウェアです。
ステライメージの画像処理エンジンはRAMと仮想メモリを組み合わせることで、ほぼ無尽蔵に(仮想メモリの作成先ドライブの容量が許すかぎり)画像を読み込むことが出来るよう設計されています。
非常に大きなデータを捌く必要がある天体画像処理において、この点は優れているのですが、この仮想メモリのデータ構造が現代CPUの並列計算手法と相性が悪く、CPUの性能を十分に引き出すことが出来ない構造上の問題を抱えていました。
ステライメージの処理速度の遅さについてはたくさんのユーザーの皆様からご指摘が寄せられており、デジタル天体写真撮影の情報交換イベントであるCANPに参加した際には私がアストロアーツのスタッフと知るや「ステライメージの処理速度はどうにかならないのか」というお声をたくさんいただき、ただただ恐縮するしかできませんでした。
ステライメージの仮想メモリの機構自体は今の時代でもなお色褪せていないという確信があったため、ステライメージの画像処理エンジンのコア部分をLinux上で動作するよう、こっそり(プライベートな計算に使うため)改造したのが今回の高速化の始まりでした。
移植ついでで仮想メモリのデータ構造を大きく作り変え、現代CPUの並列計算手法を適用して画像処理のパフォーマンスを測定した所、従来並列計算が適用出来なかった処理については約10倍、既に並列計算が適用されているものについても約3倍のパフォーマンス向上が得られることが分かりました。
ステライメージ9の開発にあたり、この改造版エンジンをWindows向けに再移植することになったのですが、私が物心つくかつかないかという昔から連綿と開発が続いている数多の処理全てに新しいデータ構造を疎通させる作業は非常に苦労しました。また、画像処理の根本を改修することになったため、従来の画像処理と一致するか網羅的なテストを行う必要があり、知識豊富な大先輩の力を借りて数多の機材で撮影された画像でのテストを繰り返し行いました。このテストから得られたフィードバックから新たに処理の改善を行い、計算精度の向上も果たすことが出来ました。
そんな裏事情もあり、ステライメージ9の新しい画像処理エンジンは実はクロスプラットフォーム、すなわちOSに依らない実装だったりします。
高速に動作させるためのベストプラクティス
ベンチマーク結果が示すとおり、これまでのステライメージはたとえ世代の異なるCPUであってもほとんどその性能差の恩恵を受けられないものでした(ただただ申し訳無さしかありません……)。
ステライメージ9はCPU性能を余す所なく引き出すことを目標に、画像処理エンジンの改修を行いました。
その結果、CPU、RAM、ストレージ(SSD)といったPC機材に投資した分だけ、見返りのある実行速度が得られるようになっています。
ステライメージ9の購入に合わせてPCを新調するまでいかなくとも、仮想メモリストレージ用のSSDを追加・設定したり、RAM容量を増やすだけでも性能向上の恩恵が得られることでしょう(特にSSDはかなり効果があり、コストパフォーマンスに優れているためおすすめです)。
一方、PCを新調する場合はCPUから選ぶことになると思います。その場合、コア・スレッド数に注目するだけでなく、L3キャッシュ(三次キャッシュ)の大きさにも注目することをおすすめします。
ステライメージ9で高速化された画像処理のうち、フィルター処理の多くは処理画素の周辺画素を読み取って補正値を決定します。この周辺画素を読み取る際、極力RAMからデータを読み出す回数を減らしたほうが高速に動作します。この読み出し回数に最も影響する要素がCPUのL3キャッシュになります。ステライメージ9の新しい高速処理はそうした現代CPUの高速演算パラダイムを意識して組まれています。
そういった意味では、AMD Ryzenシリーズは比較的廉価なモデルであっても大きなL3キャッシュを持っていることは魅力的に見えます。Intel Core iシリーズではCore i9, Core i7の最近のモデルほど大きなL3キャッシュをもつようになりました。
先述のSSDについても、PCを新調する場合はSSDの通信規格に注目することをおすすめします。従来のHDDを繋ぐのに使用するSATA規格というものがありますが、それよりも高速に動作するNVMe規格というものが登場しました。NVMeはSATAの数倍の読み書き性能を持つため、ステライメージ9の仮想メモリの動作に大きく寄与します。
さて、最後はRAM(物理メモリ)です。RAMサイズが大きければ大きいほど、画像が仮想メモリに退避される頻度が下がるのですが、RAMの増設には限界がありますし、コストパフォーマンスに優れているものでもないので、どの程度のメモリを準備すればよいかは悩ましい問題になります。ここでは普段画像処理をする画像サイズから、どの程度の空きメモリが必要になるか見積もる方法をご紹介します。
ステライメージの演算は原則32bit浮動小数点数を用います。そのため、1画素あたり4byteのメモリを消費します。普段処理する画像が6000×4000のサイズであれば、1面が約92MBになります。カラー画像の場合はRGBの3面必要になるので、約275MBです。
一般的な画像処理はRGBの各面を順に処理することができますが、処理によってはRGBの3面全てがメモリ上に乗っている必要があるもの(具体的にはRGBが同時に求められるベイヤー・RGB変換等)もあります。そのため、基本的にはRGBの3面が全て乗る状態を期待したほうが安全です。
詳細は割愛しますが、画像処理の入力画像N枚と出力画像M枚、それから画像処理の途中で一時的に確保される+αのメモリ(N+M+α枚分)があればスムーズに処理が進むはずです。+αは処理によって異なるため一概には言えないのですが、大体2〜3枚分の余裕があれば十分でしょう。具体例を挙げると、自動コンポジットの場合は入力画像が2枚、出力画像が1枚なので、2+1+α=5〜6枚分の空きメモリ(RAM)があればスムーズに処理できるでしょう。先に挙げた6000×4000の画像で言えば、1.6GB強になります。
このメモリ量の概算は仮想メモリへの書き出しにも適用することができます(あくまで概算なので厳密には一致しませんが…)。お使いのSSDのストレージサイズから何枚分の画像が載せられるかを求めることでその環境での最大処理枚数が見えてきます(具体的にはバッチコンポジットダイアログ等で大量の画像を事前にロードしておく場合は先の式の入力画像の項を増やして概算できます)。
ステライメージは仮想メモリによってほぼ無尽蔵に画像をロードできますが、ストレージが有限である以上限界があります。画像を事前に仮想メモリ上にロードしておけばスムーズに処理を動かすことができますが、ストレージを使用している以上、RAM上のデータよりも読み書き速度は劣ります。また、SSDであってもストレージをディスクフル間近まで圧迫すると書き込み速度の低下は避けることが出来ません。仮想メモリを十分に活用する場合はお使いの環境に合わせて適度な量に留めてお使い下さい。
これからのステライメージ
ステライメージ9は画像処理エンジンの改修を中心としたバージョンアップとなり、目新しい変化は少なく見えるかもしれません。
しかし、今回の改修により、これまで内部構造の事情により並列計算が難しかった処理についても並列化が行えるようになりました。また、高速演算に移植するにあたって処理の見直し・最適化を行い、処理精度が向上しました。
ユーザーの皆様から数多く寄せられている高速化を待望の声にお応えする、まず第一弾として、自動処理モード(コンポジット、画像調整)を中心に、それに対応する詳細編集モードの画像処理を高速化しました。今回対応した部分にはさらなる高速化の余地があり、またこれ以外の処理の高速化についても今後のアップデートで拡充を予定しています。
高速化以外にも数多くのお声を頂戴しております。ステライメージは今回の画像処理エンジンの改修によって、多様な画像処理を高速に実行するための礎を築いた、ようやくのスタート地点に立った状態と認識しています。今後、ユーザーの皆様の天体画像処理への情熱に応えることが出来るよう、一層気を引き締めて開発に当たっていきたいと思っております。
新しいステライメージをどうぞよろしくお願いいたします。