티스토리 뷰
Pointnet++을 compile하려는 와중에 여러가지 error를 만났다.
1. tensorflow/core/framework/op.h 를 include하지 못하는 문제
Not found error는 당연히 path 문제일 것이라고 생각해서 path를 확인해봤지만 path에는 문제가 없었다.
tensorflow를 왜 못찾을까... 생각을 해보니
'혹시 python3 가 아니라 python2 가 쓰이고 있는건 아닐까?' 하는 생각이 들었다.
아니나 다를까
shell script에 쓰여진 command는 python ~~~ 이었고 나의 default python은 python2이고, 내가 tensorflow를 install 해 놓은 것은 python3였기 때문에 안되는 것이었다..ㅇㅅㅇ
임시 해결: 모든 sh(3개의 sh)의 python을 python3 로 고쳐주니 잘 해결되었다.
(사실 default python을 python3로 바꾸는 작업을 해주는 게 맞다. 내가 모르는 어딘가에서 python2가 불리고 있을수도 있으니)
진정한 해결: default python을 tensorflow가 깔린 ver의 python으로 변경
변경방법
sudo update-alternatives --config python
로 등록된 python 확인
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 0
위 명령어를 입력하여 3.6을 (python3.6이 설치된 path 입력해야함) 가장 우선시 등록
사실 여러개 등록해놓고
sudo update-alternatives --config python
을 입력하여 default python을 고르게 하는 것이 가장 바람직.
2. /usr/bin/ld: cannot find "-ltensorflow_framework"
이번엔 compile option에 들어가있는 '-ltensorflow_framework' 가 말썽을 일으켰다.
이것은 실제로 내 tensorflow path에 libtensorflow_framework.so file이 없어서 생기는 문제였다.
대신 libtensorflow_framework.so.2 가 있었고 이를 softlink로 연결해주면 해결되는 문제였다.
해결방법: libtensorflow_framework.so 파일 이름 확인 후 softlink 생성
ls /usr/local/lib/python3.6/dist-packages/tensorflow
로 자신의 tensorflow_framework.so file의 이름을 확인해준다.
나같은 경우는 so.2로 되어있었다.
cd /usr/local/lib/python3.6/dist-packages/tensorflow
ln -s libtensorflow_framework.so.2 libtensorflow_framework.so
(cd를 한 이유는 그냥 코드 너무 길어져서 스크롤바 생겨서 했음.. 구냥 바로 해도 됨)
3. Version 때문에 생기는 자잘자잘한 친구들
1) print 문제
이 코드는 python2를 기반으로 되어있어서 print 문이 괄호 없이 쓰여진다.
이를 고쳐야한다. print의 양이 많지 않아서 나는 그냥 내가 다 일일이 고쳤다.
그러나 python2에서 python3로 넘어가는 뭔가 자동화된 코드가 있지 않을까 해서 찾아보니
2to3 filename.py
를 입력하면 된다고 한다.(나도 해본건아님, 공식사이트 참조함)
https://docs.python.org/ko/3/library/2to3.html
2to3 - 파이썬 2에서 파이썬 3으로 자동 코드 변환 — Python 3.9.6 문서
2to3 - 파이썬 2에서 파이썬 3으로 자동 코드 변환 2to3는 파이썬 2.x 소스 코드를 유효한 파이썬 3.x 코드로 변환하기 위해 일련의 변환자(fixers)를 적용하는 프로그램입니다. 표준 라이브러리는 많은
docs.python.org
2) AttributeError: module 'tensorflow' has no attribute 'placeholder'
이도 역시 나는 tensorflow2.5를 쓰고 있고 이 코드는 tenesorflow1.4를 쓰고 있다.(2017년 코드를 2021년에 쓰니 이런 문제가 발생할 수 밖에)
이는 tensorflow version2 에는 placeholder라는 속성이 없기 때문에 생기는 문제이다.
해결: 아래 두줄의 코드 입력
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
그러나 공식 문서에 따르면, 이렇게 할 경우는 tensorflow2.0의 장점들을 이용할 수가 없다고 한다.
(아예 1 동작 방식대로 동작하게 만드는 방법인듯...)
이게 싫으면 아래 문서에 여러 방법이 나와있으니 참고해보면 된다.
https://www.tensorflow.org/guide/migrate
텐서플로 1 코드를 텐서플로 2로 바꾸기 | TensorFlow Core
Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수
www.tensorflow.org
나는 1인지 2인지가 중요한게 아니라 그냥 pass
+) 저 코드를 써도 해결 안되는 애들이 있어서 그냥 그것들은 일일이 구글링해서 고쳤음. 이렇게 하는게 맞나?
4. Compile 중 WithRank 관련 warning
아니 이거 warining인 줄 알고 걍 무시했다가.. training 과정에서 segmentation fault 가 이 부분에서 떠서 고치고 넘어가야겠다 싶었다. github에 있는 이 문제 관련은 걍 버전을 맞춰라. CUDA, tensorflow-gpu 이런거 버전 다 맞춰라 이런 얘기 밖에 없었는데
결국은 g++ version을 낮춰주면 되는 문제였다. 쳇.. ㅇㅅㅇ
https://www.tensorflow.org/install/source#gpu
소스에서 빌드 | TensorFlow
소스에서 TensorFlow pip 패키지를 빌드하고 Ubuntu Linux 및 macOS에 설치합니다. 명령어는 다른 시스템에도 적용될 수 있지만, Ubuntu 및 macOS용으로만 테스트되었으며 지원됩니다. 참고: 잘 테스트되고
www.tensorflow.org
Version | Python version | Compiler | Build tools | cuDNN | CUDA |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 8.0 | 11.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 7.6 | 10.1 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 | 7.6 | 10.1 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 | 7.6 | 10.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.15.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
tensorflow_gpu-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
나는 tensorflow-gpu 1.14.0을 쓰고 있어서
apt-get install g++-4.8
명령어로 g++ 4.8을 깔아주었다.
그리고 버전 확인하고 안맞으면 update-alternatives 로 version바꿔주었다.
그랬더니 깔끔히 빌드 끝!
'이것저것 자료 > 그 외' 카테고리의 다른 글
[Open-source build] M3DSSD build 하기 (0) | 2021.09.24 |
---|---|
[Apollo] Apollo 설치 command (0) | 2021.09.15 |
[Apollo-LGSVL] Apollo와 LGSVL 제대로 연결해서 제대로 simulation하기 (0) | 2021.09.07 |
[rosbag] bag을 csv로 변환하기 (0) | 2021.06.15 |
[rosbag] rviz global option - Fixed Frame 이름 확인하기 (0) | 2021.06.15 |
- Total
- Today
- Yesterday
- docker
- shellscript
- PIP
- torch
- CUDA
- 파이썬
- 백트래킹
- 다익스트라
- 프로그래머스
- version
- 백준
- numpy
- n과m
- 카카오
- 코딩테스트
- 설치하기
- BFS
- 최소신장트리
- LGSVL
- torchscript
- 설치
- 동적프로그래밍
- pytorch
- error
- notfound
- Python
- tensorflow
- matplotlib
- dfs
- 이것이코딩테스트다
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |