• 대한전기학회
Mobile QR Code QR CODE : The Transactions of the Korean Institute of Electrical Engineers
  • COPE
  • kcse
  • 한국과학기술단체총연합회
  • 한국학술지인용색인
  • Scopus
  • crossref
  • orcid

  1. (Dept. of Computer Science and Engineering, Konkuk University, Korea.)



Parallel Processing, GPGPU, CUDA, Audio Processing, Machine Learning

1. 서 론

최근 화자 인식과 같은 음성 신호 기반 인공지능 응용의 경우 오디오 데이터 전처리 과정으로 MFCC(Mel-Filter Cepstral Coefficients)를 사용한다(1)-(1). MFCC는 음성데이터를 주파수별 특징값으로 압축하여 오디오 처리에 있어 좋은 성능을 보이지만 연상량이 많다. 특히 인공지능 학습 시 다량의 음성데이터를 MFCC 변환할 때 많은 처리 시간이 요구되며 다량의 데이터를 학습 전 MFCC 변환하여 저장할 때도 많은 시간이 소요된다. 또한, 실시간 추론을 할 때 입력 데이터를 빠르게 MFCC 변환하는 것은 필수적이다.

MFCC의 각 계산 단계는 병렬화 시 좋은 성능을 보여준다. GPGPU를 이용하여 MFCC 처리 병렬화를 하면 학습 시간을 단축할 수 있으며 실시간 추론을 위한 빠른 변환이 가능하다. 이러한 특성을 이용하여 기존 연구에서 GPGPU를 이용하여 MFCC 변환을 가속화 하였으며 CPU 대비 97배 빨라졌다(5). 기존의 가속화 방법은 단일 음성데이터 처리를 가속화 하여 실시간 MFCC 변환에 활용 시 좋은 성능을 보인다. 하지만 다량의 데이터를 처리할 때 반복적인 데이터 복사가 이루어지며 병목현상이 발생하게 된다. 반복적인 데이터 복사에서 발생하는 병목현상을 해결하고 GPGPU 활용의 효율성을 높이기 위해 추가적인 구현이 필요하다. 또한, GPGPU를 이용하여 MFCC 처리를 하면 데이터 복사 시간이 추가로 존재한다. 따라서 데이터 복사 시간을 숨길 수 있다면 처리 속도를 보다 향상할 수 있을 것이다. 본 논문에서는 계산-통신 중첩과 함께 다중커널 중첩기법을 이용하는 방법을 제안하고자 한다. 다중커널 중첩기법을 이용하여 데이터 복사 시간을 숨기고 GPGPU의 활용 효율성을 극대화했다. 또한, 다량의 데이터뿐만 아니라 길이가 긴 단일 음성데이터 처리에 다중커널 중첩기법을 적용하여 처리 시간을 단축했다. 최종적으로 학습을 위한 대량의 음성데이터 MFCC 처리 시간을 단축하였다.

본 논문은 2장에서 배경 지식으로 MFCC 처리 과정과 GPU의 CUDA 아키텍처에 관해 설명한다. 3장에서 GPGPU 기반 MFCC 구현을 위한 단계별 최적화 방법과 다중커널 중첩기법을 이용한 MFCC 처리 기법을 설명하였다. 4장에서 제안한 알고리즘의 성능을 음성데이터를 이용하여 검증하였으며 5장에서 그 결론을 정리하였다.

2. 배경 지식

2.1 MFCC

음성데이터의 주파수별 특징값을 추출하며 효율적인 오디오 데이터 압축을 위해 MFCC가 제안되었다(6). MFCC는 오디오 신호를 주파수 영역으로 바꾸며 낮은 주파수 영역에 민감한 사람의 특징을 반영하여 주파수 영역별 에너지의 합을 구한다. MFCC는 음성데이터 학습을 포함한 많은 오디오 신호 처리에서 사용되고 있다.

MFCC 구현에는 여러 가지 방법들이 존재하며 본 논문에서는 Pre-Emphasis, Framing, Windowing, FFT & Power Spectrum, Mel-Filter Banks, DCT, Mean-Normalization 단계를 이용하여 구현하였다. Fig. 1은 각 단계의 순서를 나타낸다.

Fig.1. The diagram of MFCC computation steps

../../Resources/kiee/KIEE.2020.69.9.1378/fig1.png

오디오 신호를 처리하기 전 Pre-Emphasis 단계를 거친다. 오디오 신호 크기에 균형을 맞추고 낮은 주파수 영역 대비 높은 주파수 영역을 강조하여 신호 대비 잡음 비(signal to noise, SNR)를 개선한다. 식(1)은 Pre-Emphasis 단계를 수식화한 것이다.

(1)
$E(t)= s(t)-\alpha s(t-1)$

$s$는 오디오 신호, $\alpha$는 Pre-Emphasis 계수이며 본 논문에서 $\alpha$값은 0.97로 하였다.

MFCC의 주목적은 시간의 흐름에 따른 음성 신호의 주파수 대역별 변화를 표현하는 것이다. 하지만 음성 데이터 전체를 주파수 영역으로 변환을 하면 주파수 변화가 잘 드러나지 않는다. 이를 해결하기 위해 짧은 순간은 주파수의 변화가 크지 않다 가정하고 음성 데이터를 여러 개의 프레임으로 나눈다. 단, 각 프레임은 서로 겹치게 하여 프레임 간 연관성을 높인다. 본 논문에서는 프레임 길이를 32ms로 하였으며 중첩 길이는 16ms로 하였다.

윈도우 함수는 일반적으로 주어진 범위를 벗어난 값은 0으로 하며 중앙에서 최댓값을 갖고 대칭인 종 모양의 함수이다. 윈도우 함수를 적용하면 저주파 영역을 필터링하는 효과가 있다. 본 논문에서는 Hamming Window 함수를 사용하였으며 크기 $N$에 대하여 식은 식(2)와 같다.

(2)
$w[n]= 0.54-0.46\cos(\dfrac{2\pi n}{N-1}),\: 0\le n\le N-1$

앞 단계가 모두 끝나면 프레임마다 FFT(Fast Fourier Transform)를 적용한다. 스펙트럼으로 변환하기 위해 결괏값을 제곱하여 크기로 나누며 이를 수식화하면 식은 3과 같다. 512 포인트 FFT를 구현하였으며 스펙트럼 결과 중 앞 257개의 값만 사용하였다.

(3)
$P=\dfrac{\left | FFT(x_{i})\right |^{2}}{N}$

Mel-Filter는 저주파에 더 민감한 사람의 특징을 반영한 필터이다. 앞서 구한 스펙트럼을 주파수 구간으로 나누어 각 구간의 합을 구한다. 이때 저주파 구간을 좁게 고주파 구간을 넓게 만들어 저주파 영역의 정보를 더 반영한다.

Mel-Filter를 구하기 위해 먼저 구하고 싶은 주파수 구간의 최솟값과 최댓값을 mel 포인트로 변환한다. mel 포인트로 변환하는 식은 식(4)와 같다. 변환한 mel 포인트를 구하고 싶은 구간의 개수만큼 선형적으로 나눈다. 나눈 mel 포인트 구간들에 식(5)를 적용하여 다시 주파수 영역으로 변형한다. 나눈 주파수 구간을 필터로 만들기 위해 식(6)을 적용한다. Fig. 2와 같이 Mel-Filter는 고주파 영역으로 갈수록 넓어지며 각 구간의 중앙에서 최댓값 1을 갖는 필터이다.

(4)
$M(f)= 2595\log_{10}(1+\dfrac{f}{700})$

(5)
$F(m)=700(10^{m/2595}-1)$

(6)
$H_{m}(k)=\begin{cases} \begin{aligned}0\\\dfrac{k-f(m-1)}{f(m)-f(m-1)}\end{aligned}&\begin{aligned},\: k<f(m-1)\\,\: f(m-1)\le k\le f(m)\end{aligned}\\ \begin{aligned}\dfrac{f(m+1)-k}{f(m+1)-f(m)}\\0\end{aligned}&\begin{aligned},\: f(m)\le k\le f(m+1)\\,\: k>f(m+1)\end{aligned} \end{cases}$

Fig.2. The plot of Mel-Filter

../../Resources/kiee/KIEE.2020.69.9.1378/fig2.png

앞서 나눈 프레임들을 서로 중첩되어 있다. 따라서 각 프레임은 상관관계가 높은데 이는 여러 기계학습 모델의 성능에 영향을 미칠 수 있다. 프레임 간 상관관계를 낮추기 위해 Discrete Cosine Transform(DCT)을 적용하며 식은 식(7)과 같다. DCT 적용 후 나머지 값들은 주파수 성분이 매우 빠르게 변하기 때문에 2번째에서 13번째 값만 취한다.

(7)
$X_{k}=\sum_{n=0}^{N-1}x_{n}\cos(\dfrac{\pi}{N}(n+\dfrac{1}{2})k),\: k=0,\: ...,\: N-1$

마지막으로 값의 균형을 맞추고 SNR을 개선하기 위해 모든 프레임에 대해 각 주파수 대역의 평균을 구한 뒤 전체 구간에서 빼준다.

2.2 CUDA

CUDA(Compute Unified Device Architecture)는 GPU 병렬처리를 위한 Nvidia GPGPU 소프트웨어 및 하드웨어 아키텍처이다. CUDA는 다량의 데이터를 커널로 처리하며 한 커널은 다수의 스레드 블록들로 실행된다. 스레드들을 묶어 스레드 블록(thread block)이라 하며 블록들을 묶어 그리드(grids of thread blocks)라 한다. 커널은 그리드 즉, 다수의 블록을 실행할 수 있으며 각 블록은 하나의 SM(Streaming Multiprocessor) 코어에서 실행된다. 블록에 속한 스레드들은 32개의 스레드를 나타내는 warp 단위로 스케줄링 된다.

메모리는 크게 global 메모리와 shared 메모리가 있다. 그리드에 속한 모든 블록과 스레드들은 global 메모리에 접근할 수 있으며 shared 메모리는 같은 블록에 속한 스레드들만 값을 공유할 수 있다. shared 메모리는 프로그래밍 가능한 캐시와 같다. Fig. 3은 CUDA 스레드 – 메모리 모델을 도식화한 것이다. 기존의 알고리즘을 GPGPU로 구현하기 위해 GPU에 적합한 최적의 구현 방법을 고려해야 한다(7).

GPGPU에서 데이터를 처리하기 위해선 먼저 CPU로부터 처리해야 할 데이터를 복사해야 한다. 데이터 복사는 많은 시간을 소요한다. 이를 상쇄시키기 위해 GPGPU에서 데이터를 처리할 때 최대한 많은 스레드를 사용한다. 스레드를 최대한 많이 사용하여 처리 시간을 단축한다. 또한, 캐시 적중률을 높이기 위해 데이터 접근에 일관성을 유지해야 하며 빈번하게 사용하는 데이터는 shared 메모리를 적절히 사용해야 한다.

Fig.3. CUDA thread - memory model

../../Resources/kiee/KIEE.2020.69.9.1378/fig3.png

CUDA 아키텍처는 호스트에서 디바이스로 메모리를 복사(HtoD), 디바이스에서 호스트로 메모리를 복사(DtoH), 커널을 실행하는 엔진으로 구성되어있다. 각각의 엔진은 병렬적으로 실행될 수 있다. 따라서 CUDA를 사용한 가장 효율적인 구현은 앞서 계산한 결과를 호스트로 복사하며(DtoH), 현재 처리해야 할 값을 계산하고, 다음에 계산할 값을 디바이스로 복사(HtoD)하는 작업을 동시에 그리고 연속적으로 실행하는 것이다.

CUDA에서 명령어 실행 파이프라인을 stream이라 한다. stream에 원하는 처리를 입력하면 디바이스에서 명령을 실행한다. steam에 입력된 명령들은 순차대로 실행되며 서로 다른 stream의 명령들은 병렬적으로 실행될 수 있다. 따라서 서로 다른 명령을 실행하기 위해선 복수의 stream을 사용해야 한다. 여러 개의 stream을 사용하면 HtoD, DtoH, 커널 함수를 병렬적으로 실행할 수 있다. 사용하는 CUDA core의 개수, 레지스터 크기에 따라 커널 또한 동시에 실행할 수 있다.

3. GPGPU를 이용한 MFCC 구현 최적화

GPGPU 기반 병렬 MFCC의 성능을 향상하기 위하여 기존 병렬 MFCC의 단계별 처리 시간을 분석하였다. 자세한 결과는 Fig. 4와 같이 FFT, DCT, Mel-Filter 단계가 많은 시간을 소요한다. DCT 단계의 경우 반복 사용되는 cosine 값을 테이블로 만들어 참조함으로써 처리 시간을 단축할 수 있었다. Pre-Processing 단계에서 메모리 복사 시간을 줄이기 위해 음성데이터를 다른 위치로 복사하여 프레임별로 정렬하는 대신 FFT 계산 시 자신이 계산해야 할 데이터의 위치를 계산하도록 수정하였다. FFT와 Mel-Filter 단계의 최적화는 각각 3.1, 3.2절에서 자세히 설명한다.

Fig.4. Pie chart of unoptimized GPGPGU MFCC computation time

../../Resources/kiee/KIEE.2020.69.9.1378/fig4.png

3.1 일관 메모리 접근법을 고려한 FFT 알고리즘

일반적으로 메모리는 데이터 읽기를 요청하면 서로 인접한 데이터를 읽어와 접근 시간이 빠른 메모리에 저장하기 때문에 연속된 값을 읽을 때 가장 효율적이다. GPU도 CPU와 같이 메모리 계층 구조로 구성되어있어 같은 원리가 적용된다. 기본적으로 Cooley-Tukey 알고리즘을 포함한 대부분의 FFT 알고리즘은 butterfly 구조를 사용한다. Butterfly 구조란 입력된 두 데이터의 합과 차의 결과를 서로 교차하여 출력 데이터에 저장한다. 이러한 Cooley-Tukey 알고리즘의 메모리 접근 패턴은 비효율적이다. 입력값과 출력값을 읽거나 쓸 때마다 메모리 접근하는 위치가 2의 제곱 승만큼 늘어나게 되어 큰 데이터를 처리할 때 캐시 적중률을 낮추게 된다. Fig. 5는 크기가 16인 데이터를 Cooley-Tukey 알고리즘을 이용하여 FFT 연산을 하였을 때 메모리 접근 패턴을 보여준다.

Fig.5. Cooley-Tukey algorithm memory access pattern

../../Resources/kiee/KIEE.2020.69.9.1378/fig5.png

Cooley-Tukey 알고리즘은 연산 완료 후 데이터의 올바른 순서를 지키기 위해 연산 전 데이터 입력 순서를 변형해야 한다. Stockham 알고리즘은 데이터 입력 순서의 변형 없이 올바른 순서의 출력을 보여주지만, Cooley-Tukey 알고리즘과 같이 메모리 접근 패턴이 2의 제곱 승만큼 늘어난다. Swarztrauber는 벡터 머신에서 FFT 알고리즘의 성능을 높이기 위해 Stockham 알고리즘의 2가지 변형 방식을 제안하였다(8). Stockham 알고리즘과 같이 입력 순서에 변형을 가하지 않으며 입력 데이터 혹은 출력 데이터의 위치를 일관적으로 참조한다. 본래의 알고리즘은 2가지 방식을 번갈아 적용하여 성능을 높인다. 본 논문에서는 Swarztrauber의 벡터 머신에서 FFT 알고리즘 기반으로 GPU에 효율적 메모리 접근을 고려하여 FFT의 출력 메모리 위치를 일관적으로 참조하는 CMA(Consistent Memory Access) 방식의 FFT 알고리즘을 제안한다. Fig. 6은 CMA 알고리즘의 메모리 접근 패턴을 보여주며 Fig. 7은 CMA 알고리즘의 pseudo 코드이다.

Fig. 5Fig. 6의 굵은 선은 스레드 0번이 참조하는 메모리 위치를 나타낸다. 회색 음영은 0번 스레드가 값을 저장한 메모리 위치이다. Cooley-Tukey 알고리즘은 단계마다 메모리를 읽거나 쓰는 위치가 2의 제곱 승만큼 늘어난다. 반면 CMA 알고리즘은 메모리의 읽기 위치는 2의 제곱 승만큼 변하지만, 메모리의 쓰기 위치는 항상 일관적으로 참조한다. Fig. 6에서 스레드 0번은 항상 메모리 위치 0번과 8번에 계산 결과를 저장하여 일관적인 메모리 접근을 하도록 구현하였다.

Fig.6. CMA FFT algorithm for GPU memory access pattern

../../Resources/kiee/KIEE.2020.69.9.1378/fig6.png

Fig.7. CMA FFT Algorithm for GPGPU pseudo code

../../Resources/kiee/KIEE.2020.69.9.1378/fig7.png

CUDA는 두 가지 타입의 global 메모리, shared 메모리를 제공한다. global 메모리는 어느 스레드에서나 접근 가능한 전역 메모리이며 shared 메모리는 같은 스레드 블록 내에서만 접근 가능한 프로그래밍 가능한 캐시이다. shared 메모리 bank 크기는 4바이트로 정수형 데이터와 같은 크기이다. 따라서 어느 위치이든 즉각 접근할 수 있고 각 스레드 간의 메모리 접근 방식에 있어서 크게 구애받지 않는다.

위 알고리즘을 global 메모리만 이용하여 구현했을 때와 shared 메모리를 이용하여 구현했을 때 두 방식의 속도 차이는 다른 알고리즘 대비 크지 않았다. 이는 캐시 적중률이 높아 두 방식의 속도 차이가 적은 것으로 해석할 수 있다. Cooley-Tukey 알고리즘을 shared 메모리를 이용하여 구현하였을 때 위 알고리즘과 큰 속도 차이는 없었다. shared 메모리는 크기 제약이 있어 큰 데이터의 처리는 불가능하며 Cooley- Tukey 알고리즘은 입력 데이터의 순서를 변형해야 하는 번거로움이 존재한다. 따라서 본 논문에서는 CMA FFT 알고리즘을 사용하였다.

3.2 CSR기반 병렬 Mel-Fitler 연산

Mel-Filter 연산을 GPU에서 효율적으로 구현하기 위해 행렬 연산으로 변환하였다. Mel-Filter를 행렬 연산으로 변환 시 95\%의 값이 0인 Sparse Matrix 형태를 띤다. 행렬값 중 0이 아닌 값만 계산하는 Sparse Matrix 알고리즘을 적용하면 연상량을 줄여 연산 시간을 단축할 수 있다. Sparse Matrix 알고리즘은 값의 저장 방식에 따라 알고리즘 구현 방식이 달라진다.

Compressed Sparse Row(CSR) 알고리즘은 Sparse Matrix를 행 기준으로 압축한다. Sparse Matrix를 행 기준으로 압축하기 위하여 값을 저장하는 배열, 각 값의 행과 열 위치를 저장하는 배열을 사용하여 총 3개의 배열로 압축한다. Fig. 8은 10 × 10 크기의 행렬을 CSR 알고리즘을 이용하여 3개의 배열로 압축한 예이다. Values에는 0이 아닌 행렬의 값을 저장한다. Column은 Values 배열 각 값의 열 위치를 저장한다. Values와 Column 배열의 길이는 0이 아닌 값들의 개수이다. Row의 각 위치는 행렬의 행을 뜻하며 값은 각 행이 계산을 시작해야 할 Values 배열의 위치를 의미한다. 만약 현재 계산해야 할 행을 k라 하면 참조해야 하는 Values의 위치는 Row[k]에서 Row[k+1]까지이다. Row의 배열 길이는 행의 크기 + 1이며 배열의 마지막 값은 행렬의 0이 아닌 값의 개수이다. Sparse Matrix를 압축 후 행마다 스레드를 배정하여 CSR 알고리즘을 구현한다. Fig. 9는 CSR 기반 병렬 Mel-Filter 연산 pseudo 코드이다.

Fig.8. Example of CSR algorithm

../../Resources/kiee/KIEE.2020.69.9.1378/fig8.png

Fig.9. Parallel Mel-Filter using CSR pseudo code

../../Resources/kiee/KIEE.2020.69.9.1378/fig9.png

3.3 다중커널 중첩

CPU 처리와 달리 GPU 처리에서는 메모리 복사 시간이 추가로 존재한다. 따라서 메모리 복사 시간을 줄이거나 이를 계산과 중첩 시킬수록 효율성은 높아진다. CUDA의 경우 stream을 사용하여 메모리 복사를 하는 동시에 커널 함수를 실행하여 메모리 복사 시간을 숨길 수 있고 이러한 모델을 계산-통신(Computation- Communication) 중첩 모델이라 한다. Fig. 10은 3개의 stream을 사용하여 메모리 복사 시간을 숨긴 계산-통신 중첩 MFCC 처리 사례이다.

Fig.10. Parallel MFCC considering a computation- communication overlapping model

../../Resources/kiee/KIEE.2020.69.9.1378/fig10.png

병렬 MFCC 구현할 때 단계마다 요청되는 스레드의 자원이 다르다. 따라서 항상 GPU의 모든 스레드 자원을 활용하는 것은 아니다. 만약 GPU의 성능을 완전히 사용하지 못하는 단계에 다른 프레임 계산을 동시에 처리한다면 전체 실행 시간을 단축할 수 있다. 하지만 MFCC 연산을 정적 스레드 할당의 단일 커널로 구현 시 커널 간의 계산-통신 중첩은 가능하나 계산 간의 중첩은 불가능하다. 본 연구에서는 MFCC 처리 커널의 각 단계를 나누어 구현하여 복수의 프레임을 계산 시 다른 프레임의 처리를 동시에 실행할 수 있는 다중커널 중첩기법을 제안하고자 한다. Fig. 11은 3개의 stream을 사용하여 다중커널 중첩기법을 적용한 MFCC 처리 순서도이다. 단일 커널에서는 사용 가능한 스레드와 스레드 블록의 개수가 정적으로 할당되어 중첩이 잘 이루어지지 않는다. 하지만 다중커널에서는 각 커널에 필요한 스레드와 스레드 블록의 개수를 필요한 만큼 동적으로 할당할 수 있다. 따라서 계산 유닛을 분할 사용하여 여러 커널이 동시에 실행 가능하며 성능을 향상할 수 있다.

CUDA 에서 한 stream에 입력된 명령들은 순차적으로 처리되지만 서로 다른 stream에 입력된 명령들 사이의 실행 순서는 스케줄러에 의해 결정된다. 만약 GPU에서 한 번에 처리 가능한 연산량보다 더 많은 연산을 요구하는 커널이 실행된다면 스케줄러는 상황에 따라 해당 커널을 단독으로 실행시키거나 다른 커널과 함께 중첩하여 실행할 수 있다. 하지만 다른 커널과 동시에 실행한다면 단독으로 실행할 때보다 연산 시간이 증가하게 된다.

일반적으로 처리할 데이터의 크기가 줄어든다면 데이터 연산을 위한 커널의 GPU 자원 사용량 또한 줄어든다. 데이터를 나누어 한 stream에서 처리할 데이터의 크기를 줄이면 GPU 자원 사용량이 줄어 동시에 여러 커널이 중첩되어 동작할 수 있다. 하지만 커널이 중첩되어 실행되어 한 번에 처리 가능한 GPU의 연산량을 넘어갈 시 각 커널의 실행 시간이 증가하게 된다. 데이터를 작게 나누어 처리하면 데이터의 복사 빈도가 늘어난다. 빈번한 데이터 복사는 GPU의 메모리 복사 효율성을 감소시킨다. 따라서 다중커널 중첩을 적용 시 각 stream이 처리해야 데이터의 최적 크기는 구현에 따라 다르다. 본 논문에서는 stream 별 MFCC 처리 프레임의 개수를 261개로 하였다.

Fig.11. Parallel MFCC considering a multi-kernel overlapping model

../../Resources/kiee/KIEE.2020.69.9.1378/fig11.png

4. 실험 및 결과 고찰

본 실험에는 샘플링 레이트 16KH로 녹음한 4초, 16초, 32초, 64초 그리고 128초 분량의 다양한 음성데이터 사용하였다. MFCC 계산의 프레임 길이는 32ms로 하였으며 프레임 간 16ms 단위로 중첩하였다. 이때 4초 음성데이터는 261개의 프레임이 생성되며 16초, 32초, 64초, 128초 음성데이터의 프레임은 각각 1046, 2092, 4185, 8370개를 생성한다. 다량의 데이터 커널 중첩 속도 비교를 위해선 4초 분량의 데이터를 80, 320, 800 그리고 1600개를 사용하였다. 단일 데이터의 커널 중첩 속도 비교를 위해선 16초, 32초, 64초 그리고 128초 분량의 음성데이터를 각각 한 개씩 사용하였다. 실험 환경은 Table 1과 같다.

Table 1. Computing system configuration

OS

Ubuntu 18.04

CPU

i9-9900k

GPU

RTX 2080ti

Framework

CUDA 10.2

4.1 병렬 MFCC의 GPGPU 성능 향상

FFT 알고리즘에 따른 속도를 비교하기 위하여 가장 많이 사용되는 Cooley-Tukey 알고리즘과 메모리 접근의 일관성을 고려한 CMA FFT 알고리즘 사이의 속도를 비교하였다. 단일 프레임의 FFT 속도를 측정하였으며 크기는 256, 512, 1024, 2048 포인트에서 각각 측정하였다. 메모리 사용에 따른 속도를 비교하기 위해 shared 메모리를 활용하였을 때 속도와 global 메모리만을 사용하였을 때 속도를 비교하였다. 각 방법에 따른 속도는 Fig. 12에 표시되어 있다. 4초 음성데이터를 261개의 프레임으로 나눈 후 FFT 처리 속도만을 측정하였으며 시간 측정 단위는 마이크로초(µs)이다. 측정 일관적인 메모리 접근을 고려한 CMA 알고리즘이 Cooley-Tukey 알고리즘보다 빨랐다. shared 메모리를 사용하였을 때 CMA 알고리즘과 Cooley-Tukey 알고리즘 사이의 유의미한 속도 차이는 나지 않았지만, global 메모리를 사용하였을 때 둘 사이의 속도 차이는 크다. 각 코어가 사용 가능한 shared 메모리는 약 48킬로바이트이다. 2048 포인트 FFT를 계산하는 데 필요한 shared 메모리는 약 64킬로바이트로 사용 가능한 메모리의 크기를 넘어간다. 따라서 shared 메모리를 이용한 FFT의 계산은 1024포인트까지만 가능하다. 2048 포인트 FFT는 global 메모리를 사용한 모델만을 측정하였다.

Fig.12. Speed Comparison with various FFT algorithms

../../Resources/kiee/KIEE.2020.69.9.1378/fig12.png

Mel-Filter를 행렬값으로 변환하면 대부분의 값이 0인 희귀행렬 형태를 띤다. Mel–Filter의 계산 성능을 향상하기 위해 GPGPU 연산에 적합한 희귀행렬 곱셈으로 변형하였다. 따라서 기존의 행렬 곱셈 알고리즘과 제안한 희귀행렬 곱셈 방식을 적용한 Mel-Filter 간의 속도를 비교하였다. 4초 음성데이터 처리의 속도를 측정하였으며 Mel-Filter의 개수는 40개고 Mel-Filter 행렬의 크기는 (261 × 40) 이다. 두 알고리즘의 속도는 Fig. 13과 같다. 제안한 희귀행렬 알고리즘을 적용한 Mel-Filter 알고리즘이 기존 연산보다 약 2.2배 빨라졌다.

Fig.13. Mel-Filter speed comparison considering CSR algorithm

../../Resources/kiee/KIEE.2020.69.9.1378/fig13.png

제안한 최적화 기법을 적용한 GPGPU 기반 병렬 MFCC과 기존의 CPU 기반 MFCC의 처리 속도 비교를 위해 4초 음성데이터 처리 속도를 측정하였다. 시간 측정 단위는 마이크로초(µs)이며 실험 결과는 Table. 2와 같다. CPU 대비 GPU는 데이터 복사 시간이 추가로 존재하며 데이터 복사 시간을 합하였을 때 GPU 구현 시 CPU 대비 속도가 약 434배 향상되었다. 특히 MFCC 처리에서 가장 많은 시간을 차지하는 FFT, Mel-Filter, DCT 단계를 최적화하기 전과 후의 병렬 MFCC 속도를 비교하였다. 4초 음성데이터의 MFCC 처리를 단계별 처리 속도의 누적 그래프로 표현하였다. 자세한 그림은 Fig. 14와 같다. 최적화 적용 결과 약 2.07배 빨라졌다.

Table 2. Comparison of CPU and GPGPU MFCC computation

CPU(µs)

GPU(µs)

speed up

HtoD

-

11.61

-

Pre-Process

1983.6

2.94

674.7

FFT

20472.84

26.66

767.92

Mel-Filter

600.3

5.38

111.58

DCT

1573.83

10.1

155.82

Mean-Norm

18.27

10.05

1.82

DtoH

-

1.6

-

Total

24,630.57

56.69

434.5

Fig.14. Comparison of the speed of the previous and the optimized GPGPU MFCC

../../Resources/kiee/KIEE.2020.69.9.1378/fig14.png

4.2 다중 stream GPGPU 속도 분석

GPGPU에서 다량의 데이터를 위한 다중커널 중첩 속도를 비교하기 위해 80개에서 1600개 데이터의 처리 속도를 비교하였다. 속도 비교 대상으로는 단일 stream 모델과 커널과 데이터 통신만 동시에 중첩하는 계산-통신 중첩 모델을 사용하였다. Fig. 15는 각 중첩 방법에 따른 프로파일링 결과이다.

계산-통신 중첩 모델은 단일 stream 모델 대비 데이터 통신 시간을 숨길 수 있다. 하지만 MFCC 처리 대부분을 차지하는 연산 속도에서는 차이가 없다. 다중커널 중첩기법을 사용한 모델은 데이터 통신 시간을 숨겨줄 뿐만 아니라 GPU의 연산 유닛을 최대한 활용하므로 여러 프레임의 MFCC 연산 속도를 단축할 수 있었다. 데이터 개수에 따른 속도는 Fig. 16과 같다. 단일 stream 모델과 다중커널 중첩 모델 사이의 속도는 처리하는 데이터의 수가 많아질수록 차이가 벌어졌다. Table 3은 음성데이터 800개 기준으로 각 모델의 성능을 비교한 것으로 다중커널 중첩 모델이 단일 stream 모델보다 약 2.87배 빨랐다.

Table 3. The speed comparison of no overlapping, comp-comm overlapping, multi kernel overlapping with 800 audio data

no-overlap

comp-comm

multi-kernel

time(ms)

64.244

50.3

22.4

GPGPU에서 단일 데이터를 위한 다중커널 중첩 속도 비교를 위해 16초에서 128초 분량의 단일 음성데이터를 사용하였다. single stream에서는 기존과 같이 MFCC 변환을 하였으며 multi stream에서는 데이터를 8개로 나눈 후 stream 8개를 사용하여 각각 데이터를 처리하였다. MFCC는 프레임별로 연산하기 때문에 프레임 간 의존성은 존재하지 않는다. 음성의 길이에 따른 단일 stream과 다중커널 중첩 방법의 속도는 Fig. 17과 같다. 32초 단일 음성에서 multi stream을 사용하였을 때 single stream 대비 속도가 약 1.3배 향상되었으며 자세한 내용은 Table 4와 같다. 시간 단위는 micro seconds(μs)이다.

Fig.15. Visual Profiling Results of the three overlapping methods. (a) no-overlap (b) computation-communication overlap (c) multi-kernel overlap

../../Resources/kiee/KIEE.2020.69.9.1378/fig15.png

Fig.16. Speed comparison with three different overlapping models

../../Resources/kiee/KIEE.2020.69.9.1378/fig16.png

Fig.17. Speed comparison of a single audio data process considering a multi-kernel overlap

../../Resources/kiee/KIEE.2020.69.9.1378/fig17.png

Table 4. Speed comparison of no overlapping and multi-kernel overlapping model using a single audio data

no-overlap

multi kernel

speed up

time(μs)

364

281

1.3

5. 결 론

최근 음성데이터를 활용한 기계학습의 경우 특징 데이터 전처리 과정으로 MFCC를 많이 활용한다. 대량의 데이터 전처리 시 GPGPU를 이용할 경우 처리 시간을 크게 단축해줄 뿐만 아니라 음성데이터를 입력받아 실시간 추론 또한 가능해진다. 본 논문에서 제안하는 GPGPU를 이용한 MFCC 구현은 기존의 CPU 대비 속도를 약 434.5배 향상했다. 또한, 다량의 데이터를 처리를 위하여 다중커널 중첩기법을 제안하였다. 800개의 음성데이터를 처리할 때 16개의 stream을 사용하여 계산-통신만을 중첩하면 단일 stream을 사용하여 비중첩 방식보다 약 1.28배 빨라졌다. 또한 본 연구에서 제시한 다중커널 중첩기법을 적용하면 계산-통신만을 중첩하였을 때보다 처리 속도가 약 2.25배 향상됐으며 중첩하지 않았을 때 대비 약 2.87배 빨라졌다.

단일 데이터 처리 또한 다중커널 중첩기법을 적용하여 속도를 향상했다. 32초 길이의 음성데이터를 8개의 stream을 이용하여 처리하였으며 단일 stream 대비 1.3배 빨라졌다. 하지만 크기가 작은 4초 분량의 음성데이터에 다중커널 중첩기법을 적용 시 크기가 작은 데이터의 빈번한 복사와 함께 병목현상이 발생 되어 속도가 오히려 느려졌다.

다중커널 중첩기법은 MFCC 변환뿐만 아니라 GPGPU를 이용하여 다량의 데이터를 처리할 때 모두 적용할 수 있다. 또한, 다중 데이터 처리뿐만 아니라 영상처리와 같이 크기가 큰 단일 데이터를 여러 개의 데이터로 나누어 처리하면 단일 데이터 처리에서도 속도 향상을 이룰 수 있을 것이다.

Acknowledgements

This research was supported by Basic Science Research Program through the National Research Foundation of Korea(NRF) funded by the Ministry of Education(NRF- 2017R1D1A1B03033128)

References

1 
Lei Y., Scheffer N., Ferrer L., McLaren M., 2014 DOI: 101109/ICASSP2014 6853887, A novel scheme for speaker recognition using a phonetically-aware deep neural network, 2014 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), Florence, pp. 1695-1699DOI
2 
Richardson F., Reynolds D., Dehak N., Oct 2015, Deep Neural Network Approaches to Speaker and Language Recognition, IEEE Signal Processing Letters, Vol. 22, No. 10, pp. 1671-1675DOI
3 
Snyder D., Garcia-Romero D., Povey D., 2015, Time delay deep neural network-based universal background models for speaker recognition, 015 IEEE Workshop on Automatic Speech Recognition and Understanding (ASRU), Scottsdale, AZ, pp. 92-97DOI
4 
Torfi A., Dawson J., Nasrabadi N. M., 2018, Text-Independent Speaker Verification Using 3D Convolutional Neural Networks, 2018 IEEE International Conference on Multimedia and Expo (ICME), San Diego, CA, pp. 1-6DOI
5 
Kou H., Shang W., Lane I., Chong J., 2013, Optimized MFCC feature extraction on GPU, 2013 IEEE International Conference on Acoustics, Speech and Signal Processing, Vancouver, BC, pp. 7130-7134DOI
6 
Davis S., Mermelstein P., August 1980, Comparison of parametric representations for monosyllabic word recognition in continuously spoken sentences, in IEEE Transactions on Acoustics, Speech, and Signal Processing, Vol. 28, No. 4, pp. 357-366DOI
7 
Nvidia , April 2018, CUDA C PROGRAMMING GUIDEGoogle Search
8 
Swarztrauber Paul N., August 1984, FFT algorithms for vector computers, Parallel Computing, Vol. 1, pp. 45-63DOI

저자소개

SangHyeuk Yoon
../../Resources/kiee/KIEE.2020.69.9.1378/au1.png

He receive the B.S. from the Department of Computer Science in Knokuk University, Seoul, Korea, in 2020.

He is working towards his M.S. Degree at the same University.

E-mail : sgryoon97@konkuk.ac.kr

Neungsoo Park
../../Resources/kiee/KIEE.2020.69.9.1378/au2.png

He received the B.S. and M.S. from the Department of Electrical Engineering in Yonsei University, Seoul, Korea, in 1991 and 1993, re- spectively, and the Ph.D. in the electrical engineering from the University of Southern California in 2002.

He was a senior engineer in Samsung Electronics Corporation, Korea.

He is currently a professor with the Department of Computer Science and Engineering, Konkuk University, Seoul.

His research interests include parallel computing, computer architecture, embed- ded system, high-performance computing for signal processing, multi-media systems, and AI ap- plications.

E-mail : neungsoo@konkuk.ac.kr