Japan
サイト内の現在位置
NumPy互換数値演算ライブラリNLCPyの新機能FTRACE
no.018ベクトルエンジン処理をプロファイリングして高速化につなげる2022.4.28 本ブログ第5回で取り上げたNumPy互換数値演算ライブラリNLCPyはNumPyを使ったスクリプトをSX-Aurora TSUBASAのベクトルエンジンを使ってさらに高速化するためにNECが開発したPython向けのライブラリです。それから約1年を経てNLCPyに追加された新機能について、今回ご紹介します。

version 1.0.0だったNLCPyは、アップデートを経て、現在はversion2.1.1に引き上げられています。
この1年間に実施されたリリース内容は次の通りです。2021年3月にフーリエ変換、線形代数のための関数や新たな行列操作メソッドなどのサポートが始まりました。その後、2021年7月にversion2.0.0へ引き上げられた際に、SCAインタフェース(ステンシル計算ライブラリSCAを利用するインタフェース)や、いくつかの関数サポートの追加、そしてNLCPy処理部における性能測定を行うFTRACE機能がサポートされました。FTRACEは本来、ベクトルエンジン向けコンパイラ(nfort、ncc/ncc++)と組み合わせて使用されるものです。FortranやC/C++コードで記載されたプログラム内の各関数別に性能情報を確認できるようになります。思うような処理速度が得られないとき、FTRACEを使って時間がかかっている関数の特定や、またベクトル演算率が低い関数を検知するといったことが可能です。version2.1.0からはNLCPyで記載されたコード部分についても、FTRACEを使った性能情報プロファイリングが行えるようになっています。
そして、2022年1月リリース版でNLCPyにJITコンパイル機能が追加されました。このJITコンパイルについては、回を改めてその機能や使用方法に触れる予定です。ここでは簡単な説明に止めますが、Pythonプログラムから、FortranやC/C++で書かれたプログラムを利用できるようにするものです。JITコンパイル機能を使うと、FortranやC/C++のプログラムは、Pythonプログラム実行中にベクトルエンジン用にコンパイルされ、ベクトルエンジン上で実行されます。

Figure-1にNLCPy JITコンパイルの簡単な使用例を示しました。この例ではPythonスクリプト内に直接Cのコードを定義していますが、Pythonスクリプトの実行時にこのCコードがベクトルエンジン用コンパイラによって自動的に共有オブジェクト化されます。共有オブジェクトで定義された’ve_add’という新たな関数をPythonから呼び出すことで、’ve_add’内で定義された処理はベクトルエンジンによって実行されます。NLCPyの関数に存在しない処理をFortranやC/C++コード化する他に、独自に高速化する目的で作られた数値演算処理のルーチンを、このJITコンパイル機能を使用して共有オブジェクト化してベクトルエンジンで高速処理することができるようになります。JITコンパイル機能について、サンプルプログラムを使用した利用方法は回を改めご紹介する予定です。
今回はFTRACEによるベクトルエンジン処理のプロファイリング機能についてサンプルコードを交えて使用方法を見ていきます。
繰返しになりますが、FortranやC/C++で書いたコードをnfortやnccでコンパイルする際に$ ncc –ftrace source.cのように-ftraceオプションを追加することで、プロファイリング結果をftrace.outというファイルに出力することができます。このファイルには、指定した領域別にその領域の呼出し回数、実行時間、FLOPSをはじめとしてベクトルエンジンに固有となるベクトル演算が占める割合や平均ベクトル長、ベクトル演算の時間などが記録されます。
NLCPyで書いたコードに対してもこのFTRACEを使って指定した範囲におけるプロファイリングを行うことができるようになりました。具体的な範囲の指定方法や情報取得方法についてサンプルコードを使ってみていきます。
イメージフィルタリングを行うスクリプトを使用したFtrace region設定サンプル¶
import os
import time
import nlcpy as vp
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_images
a=np.array([1.0,2.0], dtype='float128')
sklearnの画像データセットをロード¶
dataset = load_sample_images()
画像データを0-1範囲の浮動小数点型へ変換¶
images = vp.array(dataset.images, dtype=vp.float32) / 255
assert images[0].shape[2] == 3
assert images[1].shape[2] == 3
def zero_padding(im, kw, kh):
with vp.prof.ftrace_region('zero_padding'):
ex = kw // 2
ey = kh // 2
sx = im.shape[1] + ex * 2
sy = im.shape[0] + ey * 2
im_new = vp.zeros((sy, sx, im.shape[2]), dtype=im.dtype)
im_new[ey:-ey, ex:-ex] = im
return im_new
def create_kernel(kw, kh):
with vp.prof.ftrace_region('create_kernel'):
kernel = vp.empty((kh, kw), dtype='f4')
kernel.fill(1. / kernel.size)
return kernel
def convolve(im, kernel):
with vp.prof.ftrace_region('convolve'):
ex = kernel.shape[1] // 2
ey = kernel.shape[0] // 2
im_filtered = vp.zeros_like(im)[ey:-ey, ex:-ex].copy()
ix = im_filtered.shape[1]
iy = im_filtered.shape[0]
print(ix, iy)
for w in range(kernel.shape[1]):
for h in range(kernel.shape[0]):
im_filtered[...] += im[h:iy+h, w:ix+w] * kernel[h, w]
return im_filtered
kw = 9; kh = 9;
assert (kw % 2 == 1 and kh % 2 == 1)
kernel = create_kernel(kw, kh)
im_base1 = images[0]
im_filtered1 = convolve(zero_padding(im_base1, kw, kh), kernel)
640 427
画像データ表示¶
# オリジナル画像表示
plt.figure(1)
plt.clf()
plt.axis("off")
plt.title("Original image")
plt.imshow(im_base1)
# フィルタリング処理後画像の表示
plt.figure(2)
plt.clf()
plt.axis("off")
plt.title("Filterd image")
plt.imshow(im_filtered1)
plt.show()
Figure-2のサンプルコードの中にはwith vp.prof.ftrace_region('リージョン名'):が置かれた関数が3か所あります。このように測定したい箇所(NLCPyを使用してベクトル演算処理が行われる部分)を指定することで、スクリプト実行後にサーバー側にプロファイリング情報が記録されます。

では、プロファイリング情報を表示する方法を説明します。サンプルコード実行後、スクリプトが置かれたサーバーのディレクトリにftrace.outが作成されプロファイリング情報が保存されます。ftrace –f ftrace.outで内容を表示した結果がFigure-3です。PROC.NAMEに測定箇所で定義した名称が表示され、これにより各部分毎のベクトル化処理の度合いを確認することができます。処理速度を上げるために、内包表記を多用する他、場合によってはアルゴリズムの見直しや、JITコンパイル機能を使用することでベクトル化処理の割合を高めるための指針として利用できます。
なおNLCPyから使用されるFTRACEは、メインスレッドの性能情報のみの取得であること、また、関数毎の性能測定ではなくリージョンで指定した単位での性能情報が取得可能である点が、コンパイラ向けFTRACEと異なることを追加しておきます。
今回は、NLCPyの新機能の中から主にFTRACEを使ったプロファイリングについて利用例をご紹介しました。次回以降はステンシル計算ライブラリやJITコンパイル機能についてもサンプルコードを交えて利用例を見ていく予定です。
関連リンク
最新資料/カタログはこちらからダウンロード
ご紹介資料、各種カタログをダウンロードいただけます。
My NEC登録が必要です
My NEC登録が必要です
