드디어 cmake 파일을 빌드하는데 성공했다

이거땜에 얼마나 많은 시간을 날리고 낭비했는지 ..ㅂㄷㅂㄷ


결론은 파이토치 튜토리얼에 나오것을 그대로 따라하면 안된다


일단 cmake가 버전업되면서 명령어가 바뀌었다

또한, libtorch를 cuda버전이 아닌 cpu버전으로 하니까 성공했다


빌드명령어는 cmake -S '소스코드있는 경로' -DCMAKE_PREFIX_PATH='cpu버전 libtorch폴더의 경로'


이렇게하면 빌드가 되고

이후에 make 명령어를 입력하면 exe파일을 만들어준다


아 그리고 그 사이 우분투로 OS를 바꿔 환경은 16.04, python 3.6, pytorch 1.0, cuda 9.0, libcudnn 7.4.2.24-1 이 되었다

(단 libtorch는 언급한대로 cpu 버전이다)

터미널에 출력 결과는 다음과 같다


***@******:~/example-app/build$ cmake -S ~/example-app -DCMAKE_PREFIX_PATH=~/libtorch-cpu/libtorch

-- The C compiler identification is GNU 5.4.0

-- The CXX compiler identification is GNU 5.4.0

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

-- Check for working CXX compiler: /usr/bin/c++

-- Check for working CXX compiler: /usr/bin/c++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Looking for pthread.h

-- Looking for pthread.h - found

-- Looking for pthread_create

-- Looking for pthread_create - not found

-- Looking for pthread_create in pthreads

-- Looking for pthread_create in pthreads - not found

-- Looking for pthread_create in pthread

-- Looking for pthread_create in pthread - found

-- Found Threads: TRUE  

-- Found torch: /home/lab/libtorch-cpu/libtorch/lib/libtorch.so  

-- Configuring done

-- Generating done

-- Build files have been written to: /home/lab/example-app/build

***@******:~/example-app/build$ make

Scanning dependencies of target example-app

[ 50%] Building CXX object CMakeFiles/example-app.dir/example-app.cpp.o

[100%] Linking CXX executable example-app

[100%] Built target example-app



한줄평: 진정한 스파이더맨은 역시 피터파커이다.

관람 방법: 영화관

소감

아쿠아맨과 고민하다가 호평이 자자하고, 개인적인 선호차이 때문에 이 영화를 봤다.

인생만화인 드래곤볼을 본 후부터 멀티유니버스, 평행세계에 대해 알게되었고 매우 재밌는, 흥미로운 개념이라고 생각한다.

각설하고, 영상미도 정말 좋고 전혀 지루하지않은 아주 재밌는 영화였다. 각기 다른 차원의 스파이더피플은 전부 개성넘치고 매력적이었다. 하지만 여러가지 측면에서 (비록 늙고 배나오고 돈없다고 해도) 진정한 스파이더맨은 피터파커라는 생각이 들었다. 마일스를 키우고 조언하는것부터해서 다른 스파이더피플을 위해 희생하려는 것까지, 너무너무 인상적이고 매력적이었던 것이 피터파커였다. 

개인적으로 3가지 정도 아쉬웠던 부분이 있는데, 일단 원작에 대해 무시하고 영화 하나만 본 감상이다.

1. 일본인 스파이더우먼의 존재감

러닝타임이 부족했던 탓인지 뭐때문인지 모르지만, 이 스파이더우먼의 활약이나 존재감은 별로였다. 원작에도 있는 인물같은데 영화 자체만 놓고보면 딱히.. 매력도 없고 굳이 있었어야했나? 싶다.

2. 삼촌의 죽음?

스파이더맨에서 빠질 수 없는것이 이 삼촌의 죽음이다. 멀티유니버스를 다룬 이 영화를 보면서 솔직히 기대하지 못한 부분이었는데 진부한 소재지만 신선하게 풀어냈다. 삼촌의 '며칠간 부재중일것이다'라는 메세지가 두번 나오는데 처음엔 뭔가 이상한데? 싶었다. 그리고 두번째로 메세지가 나온 순간 아 삼촌이 악당무리에 관여되어있구나 란 생각이 들면서 기대감이 높아졌다. 그리고 얼마 안가 거의 바로 프라울러로 등장해 킹핀에게 허무하게(...) 죽었다. 이 부분이 너무 아쉬웠다. 극적인 요소가 부족하단 느낌?? 개인적으로 그 상황에서 어떻게든(마일스를 데리고 킹핀으로부터 벗어나 놓아주고 킹핀에겐 죽였다고 한다던지 해서) 벗어나고, 나중에 마지막 전투장면에서 스파이더피플을 막는척하다가 킹핀을 배신해 스파이더피플을 돕고 그 과정에서 죽는게 어떻게보면 뻔하고 클리셰지만 좀더 극적이지 않을까 싶었다. 마스크는 데드풀이 생각나게하면서 매우 역동적이고 강력한(킹핀보다도) 포스를 뿜었던 인물이기에 죽음이 너무 허무하단 느낌이었다. 물론, 삼촌의 죽음은 스파이더맨을 각성시키는 자극제 역할을 하고 이 영화에서도 그렇긴하지만 이것도 약간 좀 약하달까 개연성이 모자라지않나하는 생각이 들었다. 

3. 메인 빌런의 존재감

킹핀이 너무 이해가 안갔다. 도대체 쟤가 닥터옥토퍼스나 프라울러보다 뭐가 쎈거지? 하는 느낌이었다. 스토리상 동기 설정이나, 마지막 지하철안에서 마일스(스파이더맨)를 죽이려는 장면을 킹핀 가족이 또다시 본다던지 하는것도 매우매우 맘에들었다. 하지만 킹핀이 어떤 능력을 갖고있는지, 얼마나 쎈 지 정확히 묘사가 안되었다고 생각한다. 한마디로 포스가 부족했다.


물론 이상의 아쉬운 점들이 있었지만, 충분히 재밌고 돈 아깝지 않은 영화였다. 


별점: 4.0/5.0 (한두가지 조금 아쉬운 부분이 있지만 후회되지는 않음)

한줄평: 영화를 보기 전에 '올바른' 방법이 필요하다

관람 방법: 영화관

소감

프레디머큐리 혹은 퀸의 일대기? 에 대해 다룬 영화로, 영화 내내 퀸의 음악과 퀸의 이야기가 끊이지 않으며 러닝타임이 지루하지 않은 영화였다. 보는 즐거움과 듣는 즐거움이 있는 영화였다. 

보헤미안 랩소디의 열풍에 개인적으로 퀸을 잘 몰랐기 때문에 볼 생각이 없었다. 

하지만 하도 주변에서(온오프라인 전부) 얘기를 많이 듣다보니 영화를 볼 계획은 없었지만 퀸의 음악을 찾아서 2,3주정도 들었다. 

그리고 우연한 기회에 즉흥적으로 영화를 혼자 보러 갔는데 2,3주간 퀸 음악을 들었던 것이 가장 큰 실수였다. 

영화는 퀸을 아주 잘 아는 사람들 또는 아예 모르는 사람들을 위한 것이었다. 퀸의 일대기를 다뤘지만, 

러닝타임 때문인지 매우 신속하게 지나갔으며 마지막 라이브에이드 장면에서 감동적인 느낌이 들긴했지만, 

그전 과정에서 감정이 충분히 이입되지 않아서 매우 아쉬웠다. 

개인적으로 영화나 애니 소설 등을 읽거나 감상할때 이입이 잘되는 편이라 그런지 갈등 부분에서 약간 불편하고 꺼리는 경향이 있는데,

오히려 이 영화는 너무 갈등이나 고조되는 부분이 없어서 아쉬웠다. 

아예 퀸을 모른상태로 가서 '오 퀸이 이런밴드구나 오 이 노래도 퀸꺼였어? 오 이것도?' 하며 퀸에 대해, 퀸의 노래에 대해 알아가거나 아예 퀸과 함께한 세대 혹은 퀸의 광팬으로 퀸에 대해 잘 아는 사람들이 재밌게 영화를 볼 수 있지 않을까 싶다.


별점: 4.0/5.0 (한두가지 조금 아쉬운 부분이 있지만 후회되지는 않음)

한줄평: 코믹하면서도 많은 생각을 하게 만드는, 조금은 무서움을 느낄 수 있는 아주 잘만든 영화

관람 방법: 영화관

소감

일단 영화 보는 내내 소리내어 크게 웃었다. 특히, 영화관 내 모든 사람들이 남들 신경안쓰고 모두 육성으로 웃을만큼 아주 코믹한 영화였다. 

개그 요소가 유치하거나 억지스럽지도 않게 자연스러웠다. 또한, 개인적으로 영화볼때 가장 중요하게 생각하는 스토리 짜임새나 개연성 등도 좋았다. 

배우들의 연기도 매우매우 좋았고, 반전도 존재했다. 거의 모든 것이 맘에 들었다. 이서진의 욕설 연기는 매우 찰졌고 여배우들이나 다른 배우들 연기 

역시 멋스러웠다. 유해진은 그중에서도 눈에 돋보였다. 



개인적인 해석[스포주의]:

영화를 보고난 후 가장 처음 든 생각은 유해진이 그나마 가장 양심적이고 

(사실 지금생각해보니 그나마를 안붙여도 충분할듯하다) 이서진이 제일 쓰레기라는 것이었다(주관주의). 

또한 조진웅의 딸을 대하는 태도나 일종의 양육방식? 그리고 요리솜씨가 매우 마음에 들었다. 

유해진의 경우 불륜을 저질렀다고 이해했던 사람들도 있는거같던데, 개인적으로는 그렇게 생각하지 않았다. 

분명히 유해진은 일방적으로 당하고있다라는 식으로 얘기했고, 마지막에 (현실이라고 생각되는 장면) 

화장실에서도 문자가 온걸 알지만 보지 않았기 때문이다. 그리고 영화 내내 아내에게 틱틱대고 

권위적으로 행동했지만, 아내 대신 자수해서 누명 쓴 것도 신선한 충격이었다. 

가장 놀랐던 반전장면은 역시 이서진의 귀걸이 장면. 역시나 현실이라고 생각되는 장면에서 

여전히 바람을 피는 이서진 모습에 소름이 끼쳤고 이것이 영화 본 후 이서진이 가장 쓰레기라고 생각한 이유였다. 


뭐 어쨌건 정리하자면, 오랜만에 아주 재밌고 스토리 완성도 측면에서 뒤끝 개운하게(물론 영화의 메세지로 인해 뭔가 무섭다는 생각도 들긴했지만 그것과 별개로) 관람한 영화였다. 매우매우 만족한다.


별점: 5.0/5.0 (영화관에서 돈주고 보는게 전혀 아깝지 않음)

우선 C++(VS)에서 LibTorch를 쓰기위해 몇가지 설치,설정을 해야한다


참고링크: https://zhuanlan.zhihu.com/p/52806730


VS2017이 필요하고 Cmake는 3.0 이상의 버전으로 설치한다


설치는 https://cmake.org/download/ 에서 

Windows win64-x64 ZIPcmake-3.13.2-win64-x64.zip

를 다운받아서 설치하였다.

다운받아서 압축 푼 뒤 bin폴더 경로를 시스템 환경 변수에 설치하면 된다

제대로 설치되었는지 확인은 cmd에서 cmake --version 명령어를 입력해보면 된다. 아래와 같이 잘 설치된것을 확인하면 끝


C:\Users\10127>cmake --version

cmake version 3.13.2


또한, 현재 타입 변경에 대해 narrow conversion 문제가 있다 아래 관련 링크

https://github.com/pytorch/pytorch/pull/15333



저희 연구실에서는 딥러닝 연구를 위한 gpu가 4개 달린 서버 컴퓨터가 있습니다

우분투(리눅스) os에서 어느 gpu들이 얼마나 메모리를 잡아먹는지 확인하려면 아래 명령어를 사용하면됩니다


nvidia-smi -l 1


smi까지만 입력하면 한번만 조회하고

-l(소문자 엘) 숫자 까지 입력하면 숫자 초 단위로 조회해줍니다

공식홈페이지 튜토리얼 정리글입니다

https://pytorch.org/tutorials/advanced/cpp_export.html



STEP 1: 파이토치 모델을 Torch script로 컨버팅

 Torch Script 을 이용해서 파이토치모델을 C++에서 불러올 수 있는데 여기엔 두가지 방법이 있습니다.


첫번째는 tracing 이라고 불리는 것으로 예제 인풋을 이용해서 그 인풋이 모델을 통과하면서 변화과정을 기록하는 것으로 사용 방법(control flow)이 제한적인 모델들에 적합한 방법

두번째는 모델에 소위 '주석'을 달아 Torch scrip 컴파일러가 직접적으로 파싱하고 컴파일할 수 있도록 하는 방법으로 위 Torch Script 링크를 누르면 자세한 방법이 나옴



Converting to Torch Script via Tracing

torch.jit.trace 함수에 모델 인스턴스와 예제 인풋값을 전달해주면 됨. 이러면 torch.jit.ScriptModule 오브젝트가 생성되며 모듈의 forward 메소드를 추적함

import torch
import torchvision

# An instance of your model.
model = torchvision.models.resnet18()

# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 224, 224)

# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)

trace된 ScriptModule은 이제 일반적인 파이토치 모듈로 사용가능

In[1]: output = traced_script_module(torch.ones(1, 3, 224, 224))
In[2]: output[0, :5]
Out[2]: tensor([-0.2698, -0.0381,  0.4023, -0.3010, -0.0448], grad_fn=<SliceBackward>)


Converting to Torch Script via Annotation

만약 모델이 특별한 형태나 흐름을 갖고있다면, Torch Script에 직접 기록하고 주석 달기를 원할 수 있다. 예를들어 모델이 아래와 같은 구조라면

import torch

class MyModule(torch.nn.Module):
    def __init__(self, N, M):
        super(MyModule, self).__init__()
        self.weight = torch.nn.Parameter(torch.rand(N, M))

    def forward(self, input):
        if input.sum() > 0:
          output = self.weight.mv(input)
        else:
          output = self.weight + input
        return output

이 모듈의 forward 함수는 인풋에 따라 다른 흐름을 보이기 때문에 tracing에 알맞지 않음. 따라서 torch.jit.ScriptModule 에 부분집합을 만들고 @torch.jit.script_method 주석을 forward 메소드에 추가하는 방법을 ScriptModule로 컨버팅함

import torch

class MyModule(torch.jit.ScriptModule):
    def __init__(self, N, M):
        super(MyModule, self).__init__()
        self.weight = torch.nn.Parameter(torch.rand(N, M))

    @torch.jit.script_method
    def forward(self, input):
        if input.sum() > 0:
          output = self.weight.mv(input)
        else:
          output = self.weight + input
        return output

my_script_module = MyModule()

MyModule 오브젝트를 만들면 바로 ScriptModule 인스턴스를 만들어줌 




STEP 2: Script Module을 파일로 쓰기


아래의 명령어를 이용해 파일로 저장하면, 파이썬에 의존하지안고 C++에서 모델을 사용 가능함

traced_script_module.save("model.pt")

파이썬파트 여기까지가 끝


STEP 3: C++에서 Script Module 불러오기


LibTorch라는 파이토치 C++ API를 이용해서 불러와야 함. CMake와 LibTorch를 이용해서 모델을 불러와 이용하는 간단한 예제를 만들것


모델 불러오는 코드

#include <torch/script.h> // One-stop header.

#include <iostream>
#include <memory>

int main(int argc, const char* argv[]) {
  if (argc != 2) {
    std::cerr << "usage: example-app <path-to-exported-script-module>\n";
    return -1;
  }

  // Deserialize the ScriptModule from a file using torch::jit::load().
  std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);

  assert(module != nullptr);
  std::cout << "ok\n";
}

파일 불러와 sharedpoint로 받고(C++에서의 torch.jit.ScriptModule) null 포인터인지 확인하는 코드임



Depending on LibTorch and Building the Application

위 코드가 example-app.cpp라는 스크립트에 적혀있다고 할때 CMakeLists.txt는 다음과 같음

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)

find_package(Torch REQUIRED)

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 11)

마지막으로 필요한것은 LibTorch distribution이다.  download page 에서 최신버전 다운 가능함

받아서 압축 풀면 아래와 같음

libtorch/
  bin/
  include/
  lib/
  share/

lib/ 폴더는 공유 라이브러리 포함

include/ 폴더는 헤더파일 포함

share/ 폴더는 위에 find_package 명령어를 실행하기위한 필요한 CMake configuration을 포함


예제 경로가 다음과 같을때:

example-app/
  CMakeLists.txt
  example-app.cpp

다음의 명령어들을 실행하여 애플리케이션을 빌드함

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..
make

/path/to/libtorch 는 LibTorch distribution을 압축 푼 풀 경로여야함. 만약 잘 됐다면 아래와 같아야함

root@4b5a67132e81:/example-app# mkdir build
root@4b5a67132e81:/example-app# cd build
root@4b5a67132e81:/example-app/build# cmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /example-app/build
root@4b5a67132e81:/example-app/build# make
Scanning dependencies of target example-app
[ 50%] Building CXX object CMakeFiles/example-app.dir/example-app.cpp.o
[100%] Linking CXX executable example-app
[100%] Built target example-app

ResNet18모델을 성공적으로 만들었다면 아래와 같은 메세지가 뜸

root@4b5a67132e81:/example-app/build# ./example-app model.pt
ok


STEP 4: Executing the script module in C++

명령어 조금만 넣으면 바로 실행 가능 아래의 코드를 main() 함수에 추가

// Create a vector of inputs.
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({1, 3, 224, 224}));

// Execute the model and turn its output into a tensor.
at::Tensor output = module->forward(inputs).toTensor();

std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';

모델의 인풋과 아웃풋은 IValue 타입이다 이후 forward 를 실행하고 텐서로 변환함

마지막줄은, 아웃풋의 처음 5개만 출력하는 것







8.5 9.0 10.0 피라미드
12 12 12 12 12

'운동(Workout) > 운동일지' 카테고리의 다른 글

운동  (0) 2018.11.26
운동  (0) 2018.11.21
운동  (0) 2018.11.19
운동  (0) 2018.11.15
운동  (0) 2018.11.13
러닝 제대로못함
웨이트는 느낌 좋았음

초록공스쿼트
복근
푸쉬업
마클

초록케틀벨

'운동(Workout) > 운동일지' 카테고리의 다른 글

운동  (0) 2018.11.30
운동  (0) 2018.11.21
운동  (0) 2018.11.19
운동  (0) 2018.11.15
운동  (0) 2018.11.13

+ Recent posts