이 글은 우분투 20.04, 도커, CUDA 11.0 기반 NVIDIA-DOCKER, Tensorflow, Pytorch 설치 및 사용 방법을 간단히 설명한다. NVIDIA-DOCKER를 이용하면, 딥러닝 프레임웍 설치 시 많은 문제를 일으키는 패키지 의존 에러 없이, 미리 설치된 딥러닝 관련 패키지를 이용해 편리하게 딥러닝 모델을 개발할 수 있다. 또한, 아마존, 구글 같이 비싼 기계학습 딥러닝용 클라우드를 사용하지 않고도, 직접 여러사람이 네트워크로 접속할 수 있는 서버를 개발할 수 있다.
NVIDIA DOCKER 아키텍처 구조
여기서는 엔비디아 CUDA및 도커는 알고 있다는 전제하에 진행한다. 관련 내용은 다음 링크를 참고한다.
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 3x3 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 3)
self.conv2 = nn.Conv2d(6, 16, 3)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
아래와 같이 출력되면 딥러닝 모델이 정상 실행된 것이다.
이제, 복잡한 딥러닝 패키지를 설치하고 설정할 필요없어, 도커 기반으로 딥러닝 모델을 손쉽게 개발할 수 있다.
이 글은 IoT 연결을 위한 언리얼기반 인터넷 서버 데이터 실시간 획득 방법을 간략히 설명한다. 이 글에서 사용하는 방법을 이용해 IoT와 언리얼을 연결해, 물리 세계와 가상 세계를 연결하는 간단한 메타버스, 디지털 트윈 앱을 개발할 수 있다.
물리 세계 - 센서 - 아두이노 - 시리얼포트 - 인터넷 서버 - 언리얼 - 가상 디지털 세계
언리얼 네트워크 통신 방법은 다양하다. 제일 편한 방법은 누군가 만들어놓은 플러그인을 사용하는 것이다. 그럼 코딩없이 블루프린트에서 데이터를 교환할 수 있다. 직접 개발하려면 C++을 사용해야 한다. 이 경우, 라이센스 비용 없이 기능을 구현할 수 있고, 실무적으로는 이런 방식이 복잡한 문제인 경우 유연성이 높아 자주 사용한다.
IoT 장치와 연결하기 위해서는 다양한 데이터소스와 연결하는 프로토콜을 구현해야 한다. 데이터소스는 Serial port, Socket, Websocket, HTTPsocket, MQTT, TCP/IP, UDP 외에 MySQL, MongoDB와 같은 데이터베이스가 될 수도 있다. C++로 구현할 경우, 언리얼 개발사에서 제공하는 예제가 그리 많지 않다. 그래서, 소스코드를 확인하고, 개발 문서를 체크해야 한다.
여기서는 대표적인 방법을 설명한다.
SocketIOClient 방법
이는 기본 제공하는 SocketIOClient 컴포넌트를 블루프린트에서 개발하는 방법이다. 개발 방법을 이해하기 쉽게, IoT에서 데이터를 받아 그 값을 인터넷으로 방송하는 new wind서버를 만든다. new wind 토픽의 값은 아두이노 센서에서 얻은 데이터로 한다. 개발 순서는 다음과 같다.
1. 아두이노를 연결하고 펌웨어 설치(파일>예제>Firmata>StandardFirmataPlus 선택 후 업로드)(참고)
2. Socket이란 이름의 블루프린터를 액터를 파생받아 생성
3. 블루프린트를 다음과 같이 코딩함
4. 서버 개발을 위한 폴더 생성 후 node 패키지 설치
npm install --save express
npm install johnny-five --save
npm install serialport
npm i socket.io
npm i http
npm i util
5. 서버를 server.js이름으로 코딩
해당 패키지의 메뉴얼(Johnney-five manual)을 참고해, 아두이노에서 센서 데이터를 가져와 변수로 저장한 후, 코드에서 io.emit() 에 해당하는 부분에 해당 변수값을 넣어준다.
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var util = require('util');
var five = require('johnny-five');// nw.require('nwjs-j5-fix').fix();
이 글은 아두이노와 언리얼(Unreal) 게임엔진을 연결하는 간단한 방법을 설명한다. 이 글은 실시간으로 시리얼 통신에서 얻은 센서값을 언리얼의 액터 메쉬의 머터리얼(재질) 색상에 직접 설정하는 방법을 포함한다. 센서와 언리얼 연결 방법을 보여주기 위해, 별도 상용 언리얼 플러그인을 사용하지 않고, C++에서 통신 모듈을 간단히 개발해 사용한다. 이 글에서 설명하는 같은 방식으로 텍스처, 광원, 메쉬 위치 등을 센서 값에 따라 실시간으로 변경할 수 있다.
이 글의 개발 결과는 다음과 같다. 화면에서 각 큐브는 물리적 센서에서 얻은 데이터값을 색상으로 표시한다. 이를 잘 이용하면, 언리얼을 이용해 IoT와 연결된 디지털트윈(Digital Twin)이나 메타버스(Metaverse)를 쉽게 개발할 수 있다.