DeepStream 및 Akka Streams를 사용한 Edge AI용 서버 구축

안녕하세요! Go나 Python이 기세가 있는 가운데, 사내에서도 완고하게 Scala를 사용하고 있다 @rkyymmt@github 입니다. 다이버 시티 중요!

이번에는 올해 Edge AI PoC 사건으로 구축한 Edge 서버에서 사양한 기술에 대해 조금 설명하고 싶습니다.

HW



하드웨어는 다음과 같은 구성입니다.

심도 센서(Intel RealSense)는 Jetson Nano 경유로, 다른 비교적 프리미티브인 센서는 M5Camera의 Grove 커넥터에 연결해 Wi-Fi 경유로, 취득한 데이터를 Edge AI 서버의 NVIDIA Jetson AGX Xavier에 흘려 넣는 구성으로 합니다 했다.
Depth Sensor의 Depth 정보는 Jetson Nano에서 1차 처리를 실시한 후, 검출 정보만 Xavier에 보냈습니다.



SW



소프트웨어는 다음과 같이 구성되었습니다.
M5Camera로부터의 영상 스트리밍은 멀티 플랫폼의 스트리밍 프레임워크인 GStreamer 기반의 SDK인 NVIDIA DeepStream로 파이프적인 가공·필터·AI 처리를 실시한 후, Kafka에 흘려 넣어, Alpakka 경유로 Scala로부터 조작했습니다.
또 다른 센서 정보는 JSON을 Akka Streams의 HTTP 구현인 Akka HTTP로 받는 형태를 취했습니다.



예를 들어 위의 JSON을 받는 웹 서버 부분은 다음과 같은 코드입니다.
import java.io._
中略
import akka.event.Logging

final case class Value(
  sensor_data: Int
)

final case class Sensor(
  timestamp: String,
  uid: String,
  `type`: String,
  values: Array[Value]
)

trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
  implicit val valueFormat = jsonFormat1(Value)
  implicit val sensorFormat = jsonFormat4(Sensor)
}

trait Service extends Directives with JsonSupport {
  val route: Route = post {
    extractLog { implicit log =>
      entity(as[Sensor]) { sensor =>
        val timestamp = sensor.timestamp
        val uid = sensor.uid
        val `type` = sensor.`type`
        val values = sensor.values
中略
        complete(StatusCodes.OK)
      }
    }
  }
}

object Main extends Service {
  implicit val system: ActorSystem = ActorSystem()
  implicit val materializer: ActorMaterializer = ActorMaterializer()

  def main(args: Array[String]): Unit = {
    Http().bindAndHandle(route, "localhost", 8080)
  }
}

마지막으로



Go도 좋지만, Scala도 좋다.

좋은 웹페이지 즐겨찾기