[해결됨] WSL2 CUDA undefined symbol: devicesetgpcclkvfoffset 문제 해결하기

[추가] 현재는 Fix된 이슈임

Windows 11 Insider Preview Build 22000.51이 나온 뒤에는 해결된 문제입니다. 아래 환경에서 테스트하였으니 apt 패키지와 드라이버를 업데이트 해보시기 바랍니다.

  • OS: Windows 11 Insider Preview Build 22000.51
  • Driver: NVIDIA 470.76
  • APT Package Version List
Inst libnvidia-container1 (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst libnvidia-container-tools (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst nvidia-container-toolkit (1.5.1-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst nvidia-container-runtime (3.5.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst nvidia-docker2 (2.6.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [all])
 Conf libnvidia-container1 (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf libnvidia-container-tools (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf nvidia-container-toolkit (1.5.1-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf nvidia-container-runtime (3.5.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf nvidia-docker2 (2.6.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [all])

Environment: Windows 10 Insider Preview Build 21376.1
WSL2 Ubuntu release: 20.04
NVIDIA Forum Links: https://forums.developer.nvidia.com/t/nvidia-container-cli-error/177403/2?u=ji5489

문제 제기

if I run sudo nvidia-container-cli -k -d /dev/tty info

I got this error
where is ‘devicesetgpcclkvfoffset’ symbol?

– WARNING, the following logs are for debugging purposes only –
I0509 06:20:58.858216 1009 nvc.c:372] initializing library context (version=1.4.0, build=704a698b7a0ceec07a48e56c37365c741718c2df)
I0509 06:20:58.858281 1009 nvc.c:346] using root /
I0509 06:20:58.858287 1009 nvc.c:347] using ldcache /etc/ld.so.cache
I0509 06:20:58.858293 1009 nvc.c:348] using unprivileged user 65534:65534
I0509 06:20:58.858311 1009 nvc.c:389] attempting to load dxcore to see if we are running under Windows Subsystem for Linux (WSL)
I0509 06:20:58.891385 1009 dxcore.c:226] Creating a new WDDM Adapter for hAdapter:40000000 luid:1e946dc
I0509 06:20:58.917427 1009 dxcore.c:267] Adding new adapter via dxcore hAdapter:40000000 luid:1e946dc wddm version:3000
I0509 06:20:58.917515 1009 dxcore.c:325] dxcore layer initialized successfully
W0509 06:20:58.918854 1009 nvc.c:397] skipping kernel modules load on WSL
I0509 06:20:58.919404 1010 driver.c:101] starting driver service
E0509 06:20:58.950931 1010 driver.c:168] could not start driver service: load library failed: /usr/lib/wsl/drivers/nv_dispi.inf_amd64_43efafcd74b2efc9/libnvidia-ml.so.1: undefined symbol: devicesetgpcclkvfoffset
I0509 06:20:58.951399 1009 driver.c:203] driver service terminated successfully
nvidia-container-cli: initialization error: driver error: failed to process request

해결방법

I’m currently installing WSL2 Ubuntu 20.04 within Windows 10 Insider Preview Build 21376.1, and faced same issue like below.

# sudo nvidia-container-cli -k -d /dev/tty info

-- WARNING, the following logs are for debugging purposes only --

I0512 07:05:58.485519 5592 nvc.c:372] initializing library context (version=1.4.0, build=704a698b7a0ceec07a48e56c37365c741718c2df)
I0512 07:05:58.485581 5592 nvc.c:346] using root /
I0512 07:05:58.485601 5592 nvc.c:347] using ldcache /etc/ld.so.cache
I0512 07:05:58.485604 5592 nvc.c:348] using unprivileged user 65534:65534
I0512 07:05:58.485659 5592 nvc.c:389] attempting to load dxcore to see if we are running under Windows Subsystem for Linux (WSL)
I0512 07:05:58.502183 5592 dxcore.c:226] Creating a new WDDM Adapter for hAdapter:40000000 luid:185673b
I0512 07:05:58.512924 5592 dxcore.c:267] Adding new adapter via dxcore hAdapter:40000000 luid:185673b wddm version:3000
I0512 07:05:58.512956 5592 dxcore.c:325] dxcore layer initialized successfully
W0512 07:05:58.513266 5592 nvc.c:397] skipping kernel modules load on WSL
I0512 07:05:58.513404 5593 driver.c:101] starting driver service
E0512 07:05:58.521931 5593 driver.c:168] could not start driver service: load library failed: /usr/lib/wsl/drivers/nv_dispi.inf_amd64_43efafcd74b2efc9/libnvidia-ml.so.1: undefined symbol: devicesetgpcclkvfoffset
I0512 07:05:58.522047 5592 driver.c:203] driver service terminated successfully
nvidia-container-cli: initialization error: driver error: failed to process request

and I found out that apt-get experimental repository and stable one is mixed out – failing to install WSL2 one (which is available in experimental repository). as stable package is released, experimental(=WSL2) package should be released, but It wasn’t. see apt-cache madison result below.

# apt-cache madison libnvidia-container1
libnvidia-container1 |    1.4.0-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages
libnvidia-container1 |    1.3.3-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages
libnvidia-container1 | 1.3.3~rc.2-1 | https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/amd64  Packages
libnvidia-container1 | 1.3.3~rc.1-1 | https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/amd64  Packages
libnvidia-container1 |    1.3.2-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages
libnvidia-container1 |    1.3.1-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages

The point is, we should install libnvidia-container1=1.3.3~rc.2-1 version rather than libnvidia-container1=1.4.0-1. but normal apt-get install nvidia-docker2 command would install 1.4.0-1 version, and It mostly like to fail in WSL2 environment.

I successfully installed older (WSL2-exclusive) packages via apt-get install command below:

apt-get install \
    libnvidia-container1=1.3.3~rc.2-1 \
    libnvidia-container-tools=1.3.3~rc.2-1 \
    nvidia-container-toolkit=1.4.1-1 \
    nvidia-container-runtime=3.4.1-1 \
    nvidia-docker2=2.5.0-1

Those commands will install older packages, and after sudo service docker stop and sudo service docker start, CUDA will work inside docker.

[간단리뷰 1주차] MobileNetV2: Inverted Residuals and Linear Bottlenecks

  • 원문: https://arxiv.org/abs/1801.04381
  • 참고자료: 논문, 블로그
  • 대분야: Optimization
  • 소분야: Model Optimization, TBD …
  • 제안 기법
    • TBD
  • 키워드: TBD

MobileNet V1 돌아보기 (간단요약)

  • 문제제기: Robotics, Self-driving car, Augmented Reality 등 실시간 처리가 필요한 분야에서는 낮은 컴퓨팅 성능으로 정확한 결과를 요구함
  • 제안사항: 경량화 CNN과 speed-accuracy tradeoff를 조절하는 Hyperparameter 제안
    • Depthwise Separable-Convolution
    • width/resolution multiplier
  • 결과 1 – Depthwise Separable Convolution으로 Full-Convolution의 계산량을 약 85% 줄임
    (ImageNet 기준 Accuracy는 1.1%p 감소)
  • 결과 2 – 모델 구성에 따라 41~569 mAddsMillion Multiply-Adds (0.5~4.2 Million parameters)로 구성이 가능 → Flexible하게 모델 크기를 구성할 수 있도록 선택지를 제공 but 이에 따른 accuracy 차이가 존재
  • 결과 3 – MobileNet 구조를 사용한 Object Detector 모델에서 낮은 연산량 대비 준수한 성능을 보여주고 있음

MobileNet V2

  • 문제제기
    • SOTA 네트워크가 요구하는 컴퓨팅 성능이 높아 모바일, 임베디드에 적용이 불가능합니다.
    • ReLU Activation의 비선형성 효과로 인해, 정보(manifold)가 손실됩니다.
      → 채널 수가 충분히 많아야 정보를 보존할 수 있습니다.
  • 제안
    • Depthwise Separable Convolution (MobileNet V1)
  • Linear Bottlenecks
    • ReLU Activation은 채널 내의 정보를 불가피하게 손실됩니다.
    • 채널 내에서의 정보는 손실되지만, 여러 채널 사이에서 Input Manifold로부터 임베딩된 정보(Manifold of Interest)를 얻을 수 있다고 합니다.
  • Inverted Residual
    • Bottleneck 블록은 모든 입력이 Bottleneck-Expansion 뒤에 따라오는 형태의 Residual Block과 형태가 비슷합니다.
    • 기존에 제안된 Residual Block에 Linear Bottleneck 형태를 붙인 형태

[베이스리뷰 2주차] 간단정리 – Pyramid Attention Network

  • 원문: https://arxiv.org/abs/1805.10180
  • 참고자료: 논문요약
  • 대분야: Image Segmentation
  • 소분야: Semantic Segmentation, Network Hierarchy
  • 키워드: PAN (Pyramid Attention Network), GAU (Global Attention Upsample)

문제점

FCN의 경우 작은 객체부분이 손상되어 있다.

[1] 공간해상도 손실 (Spatial resolution loss)

작은 객체 부분 Segmentation 정확도가 낮습니다. 다중 스케일 상에서 객체들의 카테고리를 결정하는데 문제가 있어 SPP나 ASPP를 사용하게 됩니다.

Part Ⅶ. Semantic Segmentation] 6. DeepLab [1] - 라온피플 머신러닝 아카데미 - : 네이버 블로그
그리드 모양의 Artifact

다만 이렇게 하면, 그리드 모양의 Artifact를 만들어 버린다는 단점이 있습니다. 논문에서는 이러한 단점을 보완하여 CNN의 출력으로부터 High-level feature의 Pixel-level attention을 추출하는 FPA(Feature Pyramid Attention)을 제안합니다.

[2] Segmentation Detail 손실 (Weak in restructuring original resolution binary prediction)

최상단의 그림에서 볼 수 있듯이, FCN의 경우 Segmetnation의 결과가 sharp하지 않습니다. 자전거의 핸들은 아예 없어져 있습니다. 이러한 문제는 U-Net 구조를 이용하거나 Kernel을 크게 접으면 어느정도 해결된다고 알려져 있습니다(논문 참조). 다만 연산량이 많아지는 문제가 있습니다. 이러한 문제를 논문에서는 GAU(Global Attention Upsample)모듈을 제안하고 이 모듈에서 global context를 추출하였습니다. 다른 방식들보다 연산량이 적다고 합니다. VOC2012 Cityscapes에서 SOTA를 달성했다고 합니다.

제안요소

Feature Pyramid Attention (FPA) Module

네트워크는 인코더-디코더 아키텍쳐로 구성되어 있습니다. Res-5까지 거쳐서 인코딩된 결과가 Feature Pyramid를 통과해 Attention을 받아(?), 원본 크기로 다시 커지게 됩니다. 파란색 선이 Downsampling, 빨간색 선이 Upsampling입니다.

  • 참고: Spatial Pyramid Pooling
  • 특징
    • Feature Pyramid Network와 비슷한 구성
    • 3개의 스케일을 이용하여 U-Shape structure 구성
    • Feature 자체가 작아서, 커널 크기를 크게 해도 (e.g. 7×7) 계산량이 매우 커지지는 않음

Global Attention Upsample (GAU) Module

Decoder단에서의 성능을 끌어올리기 위해 PSPNet이나 DeepLab에 사용된 Bilinear 방식과, DUC에서 사용된 One-step decoder module에서의 문제점을 지적하였습니다. GAU에서는 Decoder에서의 Upsampling 시, Low-level feature과 High-level feature를 동시에 볼 수 있는 방식을 고안하였습니다. (마찬가지로, 빨간색이 Upsampling입니다.)

성능

SE는 SENet Attention Module을, C333/C357은 각각 커널 사이즈 3-3-3과 3-5-7의 Feature Pyramid Attention Module의 사용을 나타냅니다. MAX와 AVE는 각각 Max Pooling, Average Pooling을 나타내며 GP는 Global Pooling Branch (FPA 상단)를 나타냅니다.

[베이스리뷰 2주차] 간단정리 – SPP (Spatial Pyramid Pooling)

  • SPP: Fast R-CNN에서 참고한 개념. SPPNet에서 제안
  • 요약: Conv Layer에서는 사실 Resolution이 문제되지 않으나, 마지막 FC Layer의 입력 Size는 고정입니다. 이로 인해 Input Image는 무조건 같은 크기로 Resizing해서 모델에 입력해야하는 제약 조건이 생겨나게 되었는데, SPP는 이를 같은 크기의 Feature로 조절해주는 Pooling을 제안합니다.

알고리즘

  1. Input Feature Map을, 미리 정해진 영역 (4×4, 2×2, 1×1 등)으로 분할합니다. 이 때, 분할한 각 영역을 Pyramid라고 합니다.
  2. 여기서는 Pyramid의 갯수가 3개입니다. 이 때 피라미드 내 한 칸(하나의 cell)을 bin이라고 합니다.
  3. 실제 Feature의 크기보다 bin이 더 큰 영역을 나타냅니다. Feature의 각 bin에 해당하는 부분에서 MaxPooling을 수행합니다.
  4. 결과 bin을 Flatten하여 이어붙입니다.
  5. 결과적으로 bin의 갯수는 동일하므로, FC-Layer의 입력은 항상 동일한 값이 됩니다!

[베이스리뷰 1주차] 간단정리 – CRF(Conditional Random Fields)

CRF란?

  • 영상보다는 자연어처리 분야에서 많이 사용되는 통계적 모델링 기법입니다.
  • 사진 하나의 행동을 분류할 때, 하나의 행동 Sequence만을 보고 판단하지 않고 사진을 찍은 순간의 이전/이후를 참조하여 지금 상태를 결정합니다.

[베이스리뷰 1주차] DeepLab V1 “Semantic Image Segmentation With Deep Convolutional Nets And Fully Connected CRFs”

  • 원문: https://arxiv.org/abs/1412.7062
  • 참고자료: 라온피플 블로그
  • 대분야: Image Segmentation
  • 소분야: Semantic Segmentation, Statistical Learning
  • 제안 기법
    • CRF(Conditional Random Field)를 Convolutional network에 적용하여 Segment boundary를 localize하는 기법 제안
    • 공간적 정보 손실을 최소화하기 위한 Atrous Convolution 기법 제안 → Dilated Convolution으로 이어짐
  • 키워드: Conditional Random Field, Atrous Convolution

Preliminary Knowledges

  • Conditional Random Field:

Problems & Proposal

  • Single downsampling – Maxpool 레이어와 Downsampling으로 인한 Signal resolution reduction 현상이 발생합니다.
    • Atrous Convolution을 제안하여 Signal reduction을 최소화합니다. → 추후 Dilated Convolution이라는 이름으로 다시 사용됩니다.
  • Spatial insensitivity (Spatial invariance)
    • 기존의 DCNN의 경우 공간적 정확도가 떨어지는 특성이 있습니다.
    • fully-connected Conditioal Random Field를 이용하여 model 결과의 Fine-detail을 살립니다. CRF의 경우 기존 Classifier의 class score와 Low-level pixel/edge information을 결합하는데 사용되었습니다.
    • 계층의존구조(Hierarchical dependency)를 모델링하는데 Fully Connected Pairwise CRF를 사용하였습니다. 이는 기존 Boose-based Pixel-level Classifier(Semantic Segmentation)에서 성능을 높이는데 사용되었습니다.

Hole Algorithm = Atrous Convolution

  • 논문에서는 Maxpool Layer 뒤에 따라오는 8-pixel Strided Convolution 을 사용하는 대신, Sparse하게 Convolution을 수행할 수 있도록 Convolution 시 중간에 Hole을 채워넣는 연산입니다.
Atrous Convolution | 출처

같은 Kernel size의 컨볼루션을 한 번만 수행하면, Stride의 수를 늘린것과 동일하게 Feature가 작아지는 효과가 있고 이와 동시에 Receptive Field의 크기가 확장되는 효과를 얻을 수 있습니다.

Atrous Convolution은 기존 Wavelet을 이용한 신호분석에 사용되던 방식이지만, 이를 영상과 같은 2차원 데이터에도 활용하여 연산량을 줄이는 효과를 얻을 수 있습니다.

Fully-Connected Conditional Random Field For Accurate Localization

CRF Iteration에 따른 Boundary localization | 출처

DeepLab V1에서는 Atrous convolution과 함께 CRF를 후처리 과정으로 사용해 예측 정확도를 높혔습니다. 기존 Short-Range CRF는 Segmentation noise를 없애는 용도로 사용되었는데, 전체 픽셀에 대한 Fully-Connected CRF을 수행할 경우 높은 정확도로 Segmentation이 가능한 것으로 알려져 Fully-Connected CRF를 수행하였습니다.

기존의 Short-range CRF의 경우 Local connection (Neighbor-) 정보만을 사용하게 되므로 오히려 Segmentation이 뭉뚱그려지고, Sharp한 boundary보다는 Noise에 강인한 결과를 얻을 수 있었습니다.

이를 Fully-Connected CRF (추후 DeepLab V3에서는 DenseCRF라고 불립니다)를 이용하여 Pixel-by-pixel로 Fully Connected Graph로 연결합니다. 물론 노드의 수가 상당히 많은 Markov Chain이므로 시간이 상당히 오래 걸리는 Task인데, DenseCRF 논문에서는 이를 Mean Field Approximation이라는 방법으로 해결하였습니다. 이 방식을 적용하여 Message passing을 이용한 iteration 방식을 이용하면, 효과적(효율적)으로 DenseCRF를 수행할 수 있게 됩니다.

결정 트리, 랜덤 포레스트

결정 트리

매 순간마다 의사를 결정(decision)하는 트리 | 출처

Decision Tree는 특정 질문에 따라 데이터를 구분하는 모델입니다. 분기마다 항상 변수 영역을 두 개로 구분하는 Binary Tree의 형태를 가집니다. 트리의 기본 구조에 따라 첫 노드(=첫 질문)은 Root Node, 마지막 질문(=마지막 노드)는 Terminal Node(Leaf Node)라고 합니다.

깊이가 깊어질수록 의사 결정에 따른 데이터가 나뉘게 됩니다.

다만 지나치게 깊은 의사결정트리로 데이터를 구분하게 되거나 결정 트리에 아무 Parameter도 주지 않고 모델링을 할 경우 오버피팅이 발생합니다.

  • Pruning(가지치기): 오버피팅 상황을 방지하기 위한 기법입니다. Network에 각종 Constraint를 주고 모델링을 진행합니다.
    • 종류: 최대 깊이, 최대 터미널 노드 수, 노드 분할 시 최소 데이터의 수 등
    • 분류: 사전 가지치기, 사후 가지치기
  • Entropy(엔트로피): 불순도를 수치로 나타낸 척도입니다. 엔트로피와 불순도는 비례합니다. 0부터 1까지의 값을 가집니다.
  • Impurity(불순도): 분류된 하나의 범주 안에 다른 데이터가 섞여 있는 정도를 말합니다. 아래 이미지와 같은 경우 파란 점이 섞여있는 정도가 낮은 위쪽 범주의 불순도가 더 낮습니다.

랜덤 포레스트

랜덤 포레스트를 시각화한 내용 | 출처

결정 트리를 만들 때, 많은 Feature를 이용하게 되면 그만큼 가지가 많아지고 이는 오버피팅이 발생하는 원인이 됩니다. 이 Feature 중 랜덤으로 n개만 선택해서 결정 트리를 만드는 과정을 m번 반복하여, m개의 결정 트리를 만들 수 있습니다(예를 들어, 30가지의 Feature 중 랜덤으로 5가지를 뽑아서 결정트리를 만드는 과정을 5번 반복할 수 있습니다). 이러한 여러 개의 결정 트리들의 예측값들 중 가장 많이 나온 값 하나를 최종적으로 선택합니다. 이러한 결과 선택 과정을 앙상블(Ensemble)이라고 합니다. (블로그에서 가장 와닿었던 대목은, “문제를 풀 때 한명의 똑똑한 사람보다 100명의 평범한 사람들이 더 잘 푼다”라는 부분이었습니다.)

위 사진에서 아래쪽 최우측에 있는 그림이 랜덤 포레스트의 Decision Boundary입니다. 나머지는 총 5개의 결정 트리 각각의 Decision Boundary를 보여줍니다.