Tesla Cluster구축
홈 > CUDA > Tesla Cluster구축 > Win HPC2008

Win HPC2008

Home

 

 

 미루웨어는 Microsoft의 Windows HPC 2008의 공식 리셀러입니다.

 

현재의 대부분의 CUDA/Tesla 클러스터의 경우 그래픽 드라이버의 접근성으로 인하여

Linux를 사용하는 경우가 많습니다. 하지만, 많은 곳에서 Windows HPC 시스템을 도입하고 있습니다.

 

본 페이지에서는 Windows HPC 2008 시스템에서 CUDA/Tesla 시스템 구축에 대한 노하우를 안내해 드립니다.   본자료는 Microsoft MSDN, NVIDIA CUDA forum의 내용을 참고하였음을 안내해 드립니다.

 

 

Microsoft Windows 클러스터 시스템 제품군

OS

출시일

호환 커널(드라이버)

Windows CCS 2003

Apr. 2003

WinXP

Windows CCS 2003 RC2

Dec. 2005

WinXP

Windows HPC 2008

Dec. 2008

Windows Vista

Windows HPC 2008 RC2

2009

Windows 7

 

 

클러스터 제품군은 HPC Pack 등을 통해 클러스터 노드를 제어할 수 있는 관리할 수 있는 도구와 MPI 등 병렬프로그래밍에 필요한 라이브러리를 제공합니다.

 


 

 

HPC 2008 시스템 구조도

HPC cluster는 Active Directory를 통해 클러스터를 관리합니다. 또한, Head Node에서 스케쥴링이 이루어 집니다. 물론, Head Node를 Active Directory/License Server 관리용으로도 사용할 수 있습니다.

 

 

 

보안 등의 이유로 계산노드는 인터넷 접속이 차단된 사설 네트웍을 사용하실 것을 권장해 드립니다.  경우에 따라서는 인터넷을 통해 원격접속을 접속을 할 수있지만, RDP 프로토콜은 아직 많은 제약사항이 있습니다.

 

 

 

 

CCP Job Scheduler

HPC 2008 등은 Job Scheduler를 통해 병렬프로그램을 실행시킬 수 있습니다. 이는 Linux 시스템의 스케쥴러와 매우 유사하다고 보시면 됩니다.

 

 

 

일반적인 HPC 시스템에서는 Windows 시스템에서 사용하는데 문제가 없지만, CUDA/Tesla 시스템은 다양한 문제를 발생하게 됩니다. 상황은 다음과 같습니다.

 

1. RDP 환경

윈도우즈 환경에서 원격데스크톱은 매우 편리하게 원격 컴퓨터를 제어할 수 있고, 마우스 클릭, 드래그 앤 드롭 등에 대한 반응이 매우 뛰어납니다. 하지만, RDP로 접근하면, RDP 서버와 클라이언트가 H/W 제조사에서 제공하는 드라이버가 아닌 Microsoft에서 제공하는 가상 드라이버를 로드하게 됩니다. 이는 다양한 버전의 윈도우즈에서 사용가능하고, 네트웍 병목을 줄이기 위해서 입니다.

 

이런 상황에서는 CUDA/Tesla 드라이버가 로드되지  않아 CUDA 어플리케이션을 실행시킬 수 없는 현상이 발생합니다. 따라서, NVIDIA에서는 대안으로써 VNC를 통한 접속을 추천합니다.  실재 Folding@Home 다양한 CUDA가 적용된 @Home  프로그램에서 동일한 문제가 발생하여 모두 Socket 통신과 VNC로 해결하고 있습니다.

 

 

2. Session0 환경

기존의 클러스터 환경에서는 HPC application을 Session0로 실행시켰습니다. 그런데, Session0는 RDP처럼 CUDA 디바이스를 접근할 수 없습니다.

 

 

Microsoft에서도 이러한 문제점을 인식하였고, 이를 해결하기 위해 HPC application도 Console Session으로 실행할 수 있도록 확장하였습니다.  작업관리자에서 PID, Session ID를 확인할 수 있도록 옵션을 조정해줍니다.

 

 

 

HPC 마스터노드에서 HPC application이 CUDA application일 경우  HPC_ATTACHTOCONSOLE=TRUE 명령을 통해 Session0가 아닌 그래픽 드라이버에 접근할 수 있는 Consle Session으로  HPC Application을 실행시킬 수 있습니다.


 

 

다음은 MS에서 제공하는 HPC_ATTACHTOCONSOLE 설정 정보입니다.

Environment Variable Name:

Possible Values

 

HPC_ATTACHTOCONSOLE

 

TRUE

The Job Scheduler will attempt to start the submitted job in the console session.  If a console session exists that has the same owner as the user who the job is run as then the job will be started in the console session.  If the job cannot be started in the console session, either because there isn’t a logged on console session or the console session owner isn’t the same as the user who the job is running as, then the job will fail

TRY

The Job Scheduler will attempt to start the submitted job in the console session.  If a console session exists that has the same owner as the user who the job is run as then the job will be started in the console session.  If the job cannot be started in the console session, either because there isn’t a logged on console session or the console session owner isn’t the same as the user who the job is being run as, then the job will not be run in the console session but will still be run.

HPC_ATTACHTOSESSION

 

TRUE

The Job Scheduler will attempt to start the submitted job in a user’s terminal server session.  If a terminal server session exists that has the same owner as the user who the job is run as then the job will be started in that terminal server session.  If the job cannot be started in a terminal server session because there isn’t a terminal server session owned by the user who the job is running as, then the job will fail

TRY

The Job Scheduler will attempt to start the submitted job in the console session.  If a console session exists that has the same owner as the user who the job is run as then the job will be started in the console session.  If the job cannot be started in a terminal server session, then the job will not be run in a terminal server session but will still be run.


또한, Session0를 사용하기 않기 위해서는 각 Compute Node 콘솔이 동일한 계정으로 로그인 되어 그래픽카드 드라이버가 활성화 되어 있어야 합니다. 이를 위해 Auto logon 설정을 해주어야 합니다. 자동로그온 설정은 http://support.microsoft.com/kb/315231 에서 정보를 확인할 수 있습니다.  또한, 계산중 다른 사용자가 Windows 시스템을 접근하는 것을 막기위해 “rundll32.exe user32.dll LockWorkStation” 설정해줄 수 있습니다. 이를 통해 로그온을 통해 드라이버를 로딩후 워크스테이션을 잠궈 보안을 강화합니다.

 

또한, HPC Cluster 관리도구에서 노드관리 패널에서 GPGPU Nodes, CUDA Nodes 등으로 그룹을 설정해 주면 매우 편리합니다. 이는 MPIrun에서 host.list파일과 동일한 역할을 해줍니다.


 

 

Job Scheduler에 그룹을 설정해서 쉽게 계산노드에 잡을 실행시킬 수 있습니다.


 

 

 

실제로 Command Line으로 실행시킬 때는 다음과 같이 설정해 주면 됩니다.

“job submit /env:HPC_ATTACHTOCONSOLE=TRUE /nodegroup:”GPGPU Nodes “ myCUDA.exe”

 

이를 통해 Session0가 아닌 Console Session상태로 HPC application이 실행되어 GPU 드라이버가 활성화되어 CUDA application을 실행시킬 수 있습니다.

 

 

 


 [클러스터 모니터링 툴 제작 가이드]

 

- 소켓프로그래밍

서버 클라잉언트 기반으로 소켓 프로그램을 제작해주면 됩니다. MPIrun과 동일한 구조로 작동하지만, 차이점이 있다면, MPIrun은 네트웍을 통해서 단순히 실행파일을 deploy한다음 실행한다면, CUDA관련 클러스터 모니터링 툴은 각각의 노드에 GPU를 감지하여 몇개의 GPU가 있는지, 각 GPU의 온도는 얼마인지, CUDA어플리케이션이 실행가능한 지 등을 다각도로 분석해서 제공해줘야 하고, 특히, 각노드에 CUDA 실행파일을 수행할 수 있도록 해야 합니다.  이러한 기능은 NVAPI를 통해서 작업을 해줄 수 있습니다.

 

NVAPI는 NVIDIA 그래픽 드라이버를 설치하면 자동으로 설치되는 dll파일로, 일반 드라이버에는 header file을 제공하지 않는다. 따라서, NVAPI 개발자를 가입하여 header파일을 제공받아 개발을 진행해야 한다. 등록사이트는 다음과 같다. http://developer.nvidia.com/object/nvapi.html

 

NVAPI는 크게 3가지 버전이 있다고 합니다. 일반 개발자용, NDA 개발자용, NVIDIA내부 개발자용입니다. 미루웨어는 현재 일반 개발자용을 사용해서 간단한 작업을 테스트 해보고 있습니다. 일반 개발자용에 대한 정보는 NVAPI 홈페이지를 통해서 충분히 정보를 확인해 보실 수 있습니다.  

 

아래의 링크를 체크해보시면 nvapi 헤더파일을 확인해 보실 수 있습니다.

http://boinc.berkeley.edu/svn/trunk/boinc/coprocs/CUDA/include/nvapi.h

http://http.developer.nvidia.com/nvapi/nvapi_8h-source.html

 

 

- GPU 갯수 파악

NVAPI_INTERFACE NvAPI_EnumPhysicalGPUs ( NvPhysicalGpuHandle  nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS],
NvU32 pGpuCount  
)

This function returns an array of physical GPU handles. Each handle represents a physical GPU present in the system. That GPU may be part of an SLI configuration, or may not be visible to the OS directly.

At least one GPU must be present in the system and running an NVIDIA display driver.

The array nvGPUHandle will be filled with physical GPU handle values. The returned gpuCount determines how many entries in the array are valid.

Return values:
NVAPI_INVALID_ARGUMENT  nvGPUHandle or pGpuCount is NULL
NVAPI_OK  One or more handles were returned
NVAPI_NVIDIA_DEVICE_NOT_FOUND  No NVIDIA GPU driving a display was found
 

-CUDA가능 GPU파악

확인결과 이 기능은 일반 개발자용  NVAPI 헤더파일에는 없습니다. CUDA 클러스터를 사용하려는 어플리케이션을 제작하는 것이므로 NVAPI가 인식한 물리적인 GPU갯수를 CUDA가능 GPU로 사용해도 큰 문제는 없을 것으로 판단됩니다.  만약, 이 기능을 사용하고 싶다면 엔비디아와 공식적인 협의를 통해 NDA버전 NVAPI를 사용하시면 될 것으로 판단됩니다. 엔비디아 공식 협력사인 미루웨어도 NDA 버전 받는 프로세스가 굉장히 복잡하여 일반 개발자용 NVAPI를 사용하고 있습니다.  다른 방법으로는 PCI-e slot 번호를 받아와서 사용하실 수도 있습니다. 일반용 NVAPI에서 CUDA가능한 시스템인지 알 수 있는 방법을 계속 연구 중에 있습니다.

 

 

- 온도제어

온도제어관련 NVAPI정보는 다음과 같다. 뒷쪽에 헤더파일의 관련부분을 첨부합니다.

 

NVAPI_INTERFACE  NvAPI_GPU_GetThermalSettings (NvPhysicalGpuHandle hPhysicalGpu, NvU32 sensorIndex, NV_GPU_THERMAL_SETTINGS *pThermalSettings)

This function retrieves the thermal information of all thermal sensors or specific thermal sensor associated with the selected GPU. Thermal sensors are indexed 0 to NVAPI_MAX_THERMAL_SENSORS_PER_GPU-1.

  • To retrieve specific thermal sensor info, set the sensorIndex to the required thermal sensor index.
  • To retrieve info for all sensors, set sensorIndex to NVAPI_THERMAL_TARGET_ALL.

Parameters:

[in]  hPhysicalGPU  GPU selection.
[in]  sensorIndex  Explicit thermal sensor index selection.
[out]  pThermalSettings  Array of thermal settings.
Return values:
NVAPI_OK  Completed request
NVAPI_ERROR  Miscellaneous error occurred.
NVAPI_INVALID_ARGUMENT  pThermalInfo is NULL.
NVAPI_HANDLE_INVALIDATED  Handle passed has been invalidated (see user guide).
NVAPI_EXPECTED_PHYSICAL_GPU_HANDLE  Handle passed is not a physical GPU handle.
NVAPI_INCOMPATIBLE_STRUCT_VERSION  The version of the INFO struct is not supported.

 

Enumerator: NV_THERMAL_CONTROLLER
NVAPI_THERMAL_CONTROLLER_NONE 
NVAPI_THERMAL_CONTROLLER_GPU_INTERNAL 
NVAPI_THERMAL_CONTROLLER_ADM1032 
NVAPI_THERMAL_CONTROLLER_MAX6649 
NVAPI_THERMAL_CONTROLLER_MAX1617 
NVAPI_THERMAL_CONTROLLER_LM99 
NVAPI_THERMAL_CONTROLLER_LM89 
NVAPI_THERMAL_CONTROLLER_LM64 
NVAPI_THERMAL_CONTROLLER_ADT7473 
NVAPI_THERMAL_CONTROLLER_SBMAX6649 
NVAPI_THERMAL_CONTROLLER_VBIOSEVT 
NVAPI_THERMAL_CONTROLLER_OS 
NVAPI_THERMAL_CONTROLLER_UNKNOWN 

 

Enumerator:  NV_THERMAL_TARGET

NVAPI_THERMAL_TARGET_NONE 
NVAPI_THERMAL_TARGET_GPU  GPU core temperature requires NvPhysicalGpuHandle.
NVAPI_THERMAL_TARGET_MEMORY  GPU memory temperature requires NvPhysicalGpuHandle.
NVAPI_THERMAL_TARGET_POWER_SUPPLY  GPU power supply temperature requires NvPhysicalGpuHandle.
NVAPI_THERMAL_TARGET_BOARD  GPU board ambient temperature requires NvPhysicalGpuHandle.
NVAPI_THERMAL_TARGET_VCD_BOARD  Visual Computing Device Board temperature requires NvVisualComputingDeviceHandle.
NVAPI_THERMAL_TARGET_VCD_INLET  Visual Computing Device Inlet temperature requires NvVisualComputingDeviceHandle.
NVAPI_THERMAL_TARGET_VCD_OUTLET  Visual Computing Device Outlet temperature requires NvVisualComputingDeviceHandle.
NVAPI_THERMAL_TARGET_ALL 
NVAPI_THERMAL_TARGET_UNKNOWN 

 

헤더파일은 다음과 같습니다.

 

///////////////////////////////////////////////////////////////////////////////////
//  Thermal API
//  Provides ability to get temperature levels from the various thermal sensors associated with the GPU

#define NVAPI_MAX_THERMAL_SENSORS_PER_GPU 3

typedef enum
{
    NVAPI_THERMAL_TARGET_NONE          = 0,
    NVAPI_THERMAL_TARGET_GPU           = 1,
    NVAPI_THERMAL_TARGET_MEMORY        = 2,
    NVAPI_THERMAL_TARGET_POWER_SUPPLY  = 4,
    NVAPI_THERMAL_TARGET_BOARD         = 8,
    NVAPI_THERMAL_TARGET_ALL           = 15,
    NVAPI_THERMAL_TARGET_UNKNOWN       = -1,
} NV_THERMAL_TARGET;

typedef enum
{
    NVAPI_THERMAL_CONTROLLER_NONE = 0,
    NVAPI_THERMAL_CONTROLLER_GPU_INTERNAL, 
    NVAPI_THERMAL_CONTROLLER_ADM1032,
    NVAPI_THERMAL_CONTROLLER_MAX6649,      
    NVAPI_THERMAL_CONTROLLER_MAX1617,     
    NVAPI_THERMAL_CONTROLLER_LM99,     
    NVAPI_THERMAL_CONTROLLER_LM89,        
    NVAPI_THERMAL_CONTROLLER_LM64,        
    NVAPI_THERMAL_CONTROLLER_ADT7473,
    NVAPI_THERMAL_CONTROLLER_SBMAX6649,
    NVAPI_THERMAL_CONTROLLER_VBIOSEVT, 
    NVAPI_THERMAL_CONTROLLER_OS,   
    NVAPI_THERMAL_CONTROLLER_UNKNOWN = -1,
} NV_THERMAL_CONTROLLER;

typedef struct
{
    NvU32   version;                //structure version
    NvU32   count;                  //number of associated thermal sensors with the selected GPU
    struct
    {
        NV_THERMAL_CONTROLLER       controller;         //internal, ADM1032, MAX6649...
        NvU32                       defaultMinTemp;     //the min default temperature value of the thermal sensor in degrees centigrade
        NvU32                       defaultMaxTemp;    //the max default temperature value of the thermal sensor in degrees centigrade
        NvU32                       currentTemp;       //the current temperature value of the thermal sensor in degrees centigrade
        NV_THERMAL_TARGET           target;             //thermal senor targeted @ GPU, memory, chipset, powersupply, canoas...
    } sensor[NVAPI_MAX_THERMAL_SENSORS_PER_GPU];

} NV_GPU_THERMAL_SETTINGS;

#define NV_GPU_THERMAL_SETTINGS_VER  MAKE_NVAPI_VERSION(NV_GPU_THERMAL_SETTINGS,1)

///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION NAME:   NvAPI_GPU_GetThermalSettings
//
// DESCRIPTION:     Retrieves the thermal information of all thermal sensors or specific thermal sensor associated with the selected GPU.
//                  Thermal sensors are indexed 0 to NVAPI_MAX_THERMAL_SENSORS_PER_GPU-1.
//                  To retrieve specific thermal sensor info set the sensorIndex to the required thermal sensor index.
//                  To retrieve info for all sensors set sensorIndex to NVAPI_THERMAL_TARGET_ALL.
//
//  SUPPORTED OS: Mac OS X, Windows XP and higher
//
// PARAMETERS :     hPhysicalGPU(IN) - GPU selection.
//                  sensorIndex(IN)  - Explicit thermal sensor index selection.
//                  pThermalSettings(OUT) - Array of thermal settings.
//
// RETURN STATUS:
//    NVAPI_OK - completed request
//    NVAPI_ERROR - miscellaneous error occurred
//    NVAPI_INVALID_ARGUMENT - pThermalInfo is NULL
//    NVAPI_HANDLE_INVALIDATED - handle passed has been invalidated (see user guide)
//    NVAPI_EXPECTED_PHYSICAL_GPU_HANDLE - handle passed is not a physical GPU handle
//    NVAPI_INCOMPATIBLE_STRUCT_VERSION - the version of the INFO struct is not supported
//
///////////////////////////////////////////////////////////////////////////////
NVAPI_INTERFACE NvAPI_GPU_GetThermalSettings(NvPhysicalGpuHandle hPhysicalGpu, NvU32 sensorIndex, NV_GPU_THERMAL_SETTINGS *pThermalSettings);

 

 

- launch

CUDA 어플리케이션의 실행은 소켓프로그래밍과 연동하여 사용되는데, 실행파일을 받아 실행하는 기능과 이미 가지고 있는 실행파일을 실행하는 두가지 방법이 가능하다. 전자의 경우는 좀더 고급의 작업이 필요하다. 또한, 실행시 필요한 데이터를 읽어들이는 작업도 필요하게 되므로, 구체적인 계획을 통해 모니터링 툴을 제작하여야 한다. Windows CUDA 디버거인 Nexus의 경우 실행파일을 받아 CUDA application을 실행하는 구조로 되어있고, Elcomsoft의 런처는 Client프로그램을 설치하면, 그 프로그램 안에 실행할 프로그램이 내장되어 있다. Session0제어를 통한 스케쥴링을 넣는 것도 하나의 방법입니다. 

 

 

 

[추가 정보 업데이트]

 

현재 엔비디아에서 WDM기반의 Windows TCC(Tesla Compute Cluster) Driver 베타 드라이버가 출시되었습니다. 195.48 드라이버로 Tesla와 64비트 OS인 Windows HPC 2008, Windows HPC 2008 RC2에서만 작동됩니다.

 

TCC의 장점은 RDP에서 Tesla를 그래픽드라이버로 인식하지 않고, 가속기로 인식하여 CUDA를 실행시킬 수 있게 만든 것이 특징입니다. 따라서, 클러스터 모니터링 툴 등 다양한 Windows HPC 2008에서 기본으로 지원하는 기능을 모두 사용하실 수 있습니다.  Windows HPC 2008에서 Tesla를 기반으로  대규모 클러스터를 구축하기를 원하시는 경우 직접 문의하시기 바랍니다.