ViSQOL 설치(with Source code & trouble shooting)

seok222·2023년 1월 16일
0

Intern

목록 보기
2/6

1. Base

  • tensorflow, bazel, MSVC, python의 version을 호환이 가능한 버젼으로 설치해야한다.

  • Windows10, CPU 기준으로 아래의 version으로 설치

    • tensorflow-2.7.0
    • bazel-3.7.2
    • python-3.8.9 → python-3.9.2로
    • MSVC-2019
  • bazel build를 할 때 cc파일에서 complie error가 발생 → pip version issue일 가능성이 높음

    pip install --upgrade pip //해당 명령어로 pip version issue 해결

2. Bazel

  • bazel을 3.7.2 version으로 설치해야 하므로 아래 github 주소에 접속하여 해당 version을 찾은 다음 다운로드한다. https://github.com/bazelbuild/bazel/releases
  • bazel을 사용하기 위해 환경 변수 설정

    (위 이미지에서 설정한 환경 변수)
    
    - BAZEL_SH
    - BAZEL_VC
    - BAZEL_WINSDK_FULL_VERSION
    
    - BAZEL_SH: bazel shell창의 경로
    - BAZEL_VC: bazel build할 때 필요한 MSVC-2019 Community VC 경로 (build tools의 경로에 해당)
    - BAZEL_WINSDK_FULL_VERSION: bazel build할 때 사용하는 VC의 SDK 정보
  • PATH

    (위 이미지에서 설정한 환경 변수)
    - PATH: bazel이라는 명령어를 shell창에서 사용하기 위해 bazel.exe가 있는 디렉토리 경로

  • MYSYS2 x86_64 설치
    • bazel build를 하기 위한 도구로 아래 링크에 접속하여 msys2-x86_64-20221216.exe 설치

      MSYS2

    • MSYS2 x86_64의 bin폴더를 환경 변수 PATH 에 추가한다.

- 아래 명령어를 통해 MYSYS2가 잘 설치 되었는지 확인한다.

```powershell
pacman -S git patch unzip
```
  • Python 설치
    • Tensorflow와 호환을 위해 python latest version이 아닌 python-3.8.9를 설치한다.

      아래 링크에서 python-3.8.9 windows installer(64bit) 를 찾아서 다운로드 한다.

      Python Releases for Windows

    • Python을 사용하기 위해 환경 변수 PATH에 python의 경로를 추가한다.

      1. Python shell 창 경로 추가

        C:\Users\INNO-C-535\AppData\Local\Programs\Python\Python38\Scripts
      2. Python application 경로 추가

        C:\Users\INNO-C-535\AppData\Local\Programs\Python\Python38
      3. Python library 경로 추가

        C:\Users\INNO-C-535\AppData\Local\Programs\Python\Python38\Lib\site-packages
  • bazel 설치 확인
    • version 확인
      bazel --version //bazel이 올바르게 설치되었다면 version을 확인할 수 있다.
    • bazel build 아래 링크에 접속하여 차례대로 진행하기 Bazel Tutorial: Build a C++ Project

3. Git

  • 아래 링크에서 git-2.39.0 설치 Downloads

4. Tensorflow

  • CPU만 사용하는 것을 기준으로 설치 하였다.
  • Python 및 TensorFlow 패키지 종속성 설치
    • 아래 명령어를 통해서 tensorflow에 필요한 six와 keras_preprocessing을 설치한다.

      pip install -U six numpy wheel packaging
      pip install -U keras_preprocessing --no-deps
  • Tensorflow 설치
    • 아래의 소스를 통해 tensorflow 설치 링크로 들어간다. Build from source on Windows | TensorFlow
    • git clone을 통해서 tensorflow의 코드를 받는다.
      git clone https://github.com/tensorflow/tensorflow.git
      cd tensorflow
    • 이때 처음 git clone 해온 tensorflow의 version은 latest version이므로 git checkout을 통해서 tensorflow-2.7.0에 해당하는 branch로 바꾼다.
      git checkout r2.7
  • Tensorflow build (CPU만 사용하는 기준)
    • 아래 명령어로 tensorflow를 build 한다.
      bazel build //tensorflow/tools/pip_package:build_pip_package
    • Tensorflow build 실패 시
      1. build 내역을 지운다.

        bazel build --expunge
      2. python 구성 환경을 재설정 한다.

        python ./configure.py
      3. 다시 bazel로 build한다.

        bazel build //tensorflow/tools/pip_package:build_pip_package
  • cl.exe
    • cl.exe failed: error executing command error의 ****발생 원인 중 하나가 cl.exe의 경로가 환경 변수에 등록되지 않아서 cl.exe에 접근할 수 없는 것이다.

    • 위 error를 해결하기 위해 아래의 경로를 PATH의 환경 변수에 추가한다.

      C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.24.28314\bin\Hostx64\x64
  • MSBUILD
    • cmd 관리자 모드 창에서 tensorflow를 build하려면 msbuild.exe가 있는 폴더의 경로를 환경 변수로 추가해야 한다.

      C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
    • 위의 경로를 시스템 환경 변수 PATH에 추가한다.

      C:\Windows\Microsoft.NET\Framework\v4.0.30319
    • 간혹 위의 경로를 추가하라고 설명한 블로그나 글들이 있는데 최근에 release되는 Visual Studio의 msbuild.exe의 경로는 저 위의 경로에 해당하는 것으로 보인다.

  • cmd 관리자 모드에서 tensorflow를 bazel을 이용하여 build 한다.
    • 이때 해당 cmd의 경로가 환경 변수로 입력해 놓아야 한다.

Trouble shooting

  1. bazel output directory permission denied (bazel%USERNAME%_하위 폴더 접근 제한)
    • bazel outpu directory: bazel%USERNAME%_ 형태의 폴더가 bazel을 build하고 만들어지는 build 정보 같은 것이 들어있는 output directory이다. : 이 directory가 permission denied은 현재 bazel version과 output directory가 만들어졌을 때의 bazel version이 다르기 때문에 발생하는 것으로 output directory를 삭제하고 bazel을 다시 build하면 해결 된다. : 혹은 파일에 접근해야 하는데 환경 변수로 지정한 경로가 상위 폴더까지만 지정이 되어있어서 해당 파일에 접근하지 못할 때 발생하므로 환경 변수를 수정하면 해결이 가능하다.
  1. *.cc file compile error
    • MSVC version과 bazel version 혹은 MSVC version 과 tensorflow version간 호환 문제인 경우 : 어느 한 쪽의 version을 upgrade 하거나 downgrade를 해야 한다.
    • pip version 문제 인 경우 : 보통 이 경우 더 높은 pip version이 필요하여 발생하는 compile error로 권한이 없다는 문구가 발생한다. 아래의 명령어로 해결할 수 있다.
      pip install --upgrade pip
  2. error C2001: 상수에 줄 바꿈 문자가 있습니다.
    • 단순히 상수 값에 에러가 있는 경우 : 해당 파일에 “ ”로 감싸져 있는 값, 혹은 const 값 내부에 “\n”가 있는지 확인한다.
    • 인코딩이 잘못된 경우 (실제로 겪은 적은 없지만, 원인들 중 하나에 해당) : 파일의 인코딩 저장 방식을 바꾸는 방법도 있다.
  3. 특정 variable, class, object에 참조할 수 없다 혹은 정의되어있지 않다.
    • 코드가 의도치 않게 수정된 경우 : .h, .pyd, BUILD 파일 등에 접근하여 수정
    • 환경 변수 문제 (일반적으로 이것이 문제였다.) : 환경 변수의 경로가 잘못 되어있거나 등록이 안되어 있어 이를 해결한다. : 혹은 configure.* 에서 경로 값이 잘못 지정되어 있어 이를 수정해야 한다.
  4. ** C:/users/inno-c-535/tensorflow/tensorflow/core/kernels/BUILD:3955:18: C++ compilation of rule '//tensorflow/core/kernels:conv_ops' failed (Exit 2): cl.exe failed: error executing command
  • void 타입의 변수에게 주소를 할당하려 해서 발생한 문제 → *.h 파일과 .c 파일 간의 symbolic link가 만들어지지 않아서 나타난 문제 (아래 이미지)

: MSVC의 MSBUILD toolkit path로 BAZEL_VC의 값을 수정하였다. 이전의 BAZEL_VC는

C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC

위와 같은 경로로 되어있었고 이를 아래의 경로로 수정하였다.

C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild
  • 아래 링크대로 실행 해보았다. Error building TensorFlow 2.8 in Windows 10 —> 같은 error가 발생
  • cl.exe failed: error executing command error의 ****발생 원인 중 하나가 cl.exe의 경로가 환경 변수에 등록되지 않아서 cl.exe에 접근할 수 없는 것이다. 또 cmd 관리자 모드에서 tensorflow를 build하려면 MSBUILD에 대한 경로가 환경 변수로 추가되어있어야 한다. : cl.exe, msbuild.exe가 들어있는 폴더의 경로를 PATH의 환경 변수로 추가한 다음 cmd 관리자 모드에서 bazel을 이용하여 build —> 다른 file에서 같은 error가 발생
  • C:/users/inno-c-535/tensorflow/tensorflow/lite/python/analyzer_wrapper/BUILD:20:11: C++ compilation of rule '//tensorflow/lite/python/analyzer_wrapper:model_analyzer' failed (Exit 2): cl.exe failed: error executing command && tensorflow/lite/python/analyzer_wrapper/model_analyzer.cc(166): error C2001: 상수에 줄 바꿈 문자가 있습니다. : python-3.8.9를 python-3.9.2로 version upgrade를 진행하였고 현재 build, 아래는 참고 자료 https://github.com/tensorflow/tensorflow/issues/50950 tensorflow/lite/python/analyzer_wrapper/model_analyzer.cc(166) 부분의 코드이다.
    out_stream
          << "Your TFLite model has '" << subgraphs->Length()
          << "' subgraph(s). In the subgraph description below, T# represents the "
             "Tensor numbers. ";
    원래 "Your TFLite model has '"와 "' subgraph(s). In the subgraph description below, T# represents the "에서 ‘ ‘가 특수 기호 와 비슷한 모양으로 되어있었고 이를 ' '로 수정하고 build 한다. --> 를 상수에 줄 바꿈 문자로 인식한다(?)
  1. cannot open source file “%%%” (ex. cannot open source file "absl/strings/str_join.h”)

    • 외부에 존재하는 라이브러리에 접근하지 못하는 문제
      • 해당 파일의 절대 경로를 #include에 넣어도 접근을 하지 못한다.
      • vcpkg라는 OSS를 이용하여 라이브러리를 설치하면 해결된다고 하는데 어떤 라이브러리가 필요한 지 아직 모르겠다. (일일히 모든 라이브러리를 설치하는 것은 아닐 것이고 그것들을 하나로 아우르는 라이브러리 하나가 있을 것인데 그것이 어떤 것인지 좀 더 조사가 필요해 보인다.)

    : VSCode에 특정 일부 파일만 열려있고 해당 파일이 참조하고 있는 *.h 파일은 프로젝트 목록에 없어서 발생하는 문제이다. 그러므로 프로젝트 전체를 open하면 해결 된다.

  2. Executing genrule //tensorflow/python/keras/api:keras_python_api_gen_compat_v1 failed (Exit 1): bash.exe failed:

    : keras-preprocessing이 install 되지 않았을 때 발생하는 error 라 되어있고

    pip install -U --user keras_applications --no-deps

    실제로 위 keras_application이 install 되어있지 않았다.

    —> 동일한 error가 그대로 발생한다.

    : 아래 명령어로 build를 진행

    bazel build //tensorflow/tools/pip_package:build_pip_package --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" --noincompatible_do_not_split_linking_cmdline
    • 참고자료

    https://github.com/tensorflow/tensorflow/issues/35770

    :환경 변수에 “PYTHON_BIN_PATH”와 “PYTHON_LIB_PATH”라는 별도의 환경 변수를 만들어서 경로를 지정한다. (build 중) → error message와 tensorflow:configure 파일 분석을 통해 내린 결론

    —> 동일한 error가 그대로 발생한다.

    → 위에서 최대한 trouble shooting을 해보았지만, 성공하지 못했다…..

    Final Solution

    : 이때 해당 오류가 발생하는 bazel ouput directory의 api_gen_compat_v1이 생기는 폴더 내의 BUILD 파일을 보면 configure.py를 의존하고 있음을 알 수 있고 configure.py의 import를 보면 future 라는 라이브러리가 있는데 이는 python39/Lib/site-package에 없고 python39/Lib 내에 있는 파일이므로 PYTHON_LIB_PATH를 python39/Lib로 수정해야 한다.

    : + python의 부분에서 오류가 지속적으로 발생하고 있고 현재 내가 python이 필요한 것이 아니라 C++을 이용하여 ViSQOL을 진행할 것이기 때문에 python에 해당하는 부분은 build에 제외한다.

    bazel build tensorflow:tensorflow.dll

    위 명령어를 이용하여 오로지 C++ 버전으로 TensorFlow를 build하여 .dll 파일을 만든다. 이 .dll 파일은 아래의 경로에 해당하는 directory 내부에 존재한다.

    💡 C:/users/이름/_bazel_이름/xv6zejvsx/execroot/org_tensorflow/bazel-out/x64_windows-opt/bin/tensorflow/[tensorflow.dll](https://eehoeskrap.tistory.com/tensorflow.dll)

아래는 build한 결과에 대한 사진이다.


그리고 .dll 파일을 build하여 .lib 파일로 만든다.

bazel build tensorflow:tensorflow.lib

위 명령어를 이용하여 만들어진 *.lib 파일은 아래의 경로에 해당하는 directory 내부에 존재한다.

    💡 C:/users/이름/_bazel_이름/xv6zejvsx/execroot/org_tensorflow/bazel-out/x64_windows-opt/bin/tensorflow/[tensorflow](https://eehoeskrap.tistory.com/tensorflow.dll).lib

아래는 build한 결과에 대한 사진이다.

→ 참고 자료

[[TensorFlow] Windows 환경에서 TensorFlow 1.14 버전 Bazel 빌드하기 with C++](https://eehoeskrap.tistory.com/376)

FINAL SOLUTION

아래 링크를 참고하여 setting 한다.

Install TensorFlow with pip

  1. Visual Studio C++ 2019의 build tools를 설치해야 하는데 이는 이전에 설치를 진행하였으므로 생략한다.

  2. Miniconda Windows Installer를 다운로드한다.

  3. conda 환경을 구축한다. 그래서 cmd를 관리자 모드로 킨 다음 아래의 명령어를 입력한다.

    conda create --name tf python=3.9

    위 명령어를 통해서 python 3.9 version을 이용하는 tf라는 tensorflow 환경이 구성된다.

  1. pip를 통해서 tensorflow를 설치할 것이므로 pip version을 upgrade한다.

    pip install --upgrade pip
  1. pip를 이용해서 tensorflow를 설치한다. 다만, windows WSL이 아닌 Native에서는 tensorflow-2.10 version 까지만 제공이 되고 이 tensorflow는 이전에 만들어두었던 conda 환경인 tf 내에 설치해야한다.

    # Anything above 2.10 is not supported on the GPU on Windows Native
    pip install "tensorflow<2.11"
  2. 아래 명령어를 입력하였을 때 tensor가 반환 되면 tensorflow가 올바르게 설치된 것이다.

    python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
  • Version issue
💡 중요!! → pip를 이용하여 설치되는 tensorflow는 2.10 version이다. 그러므로 python은 3.7~3.10 사이 bazel은 최소 5.1.1 version을 설치해야 한다.
  1. visqol OSS install
  • visqol은 tensorflow, python, MVSC compiler, bazel에 의존성을 가지고 있는 VoIP 소프트웨어 프로그램으로 위의 과정을 통해 의존성을 갖고 있는 소프트웨어를 모든 설치하였으므로 build를 통해서 visqol을 가져오면 된다.

먼저 visqol의 github에서 visqol의 code를 git clone 한다.

https://github.com/google/visqol

그리고 아래 명령어를 통해서 visqol을 사용할 수 있도록 build 한다.

bazel build :visqol -c opt

아래의 이미지가 visqol을 build한 결과이다.

  1. reference wav file과 degard wav file간의 similarity를 visqol을 이용하여 비교한다.
bazel-bin\visqol.exe --reference_file "./WAV/PESQ/MOS000001.wav" --degraded_file "./WAV/PESQ/New_Korean_WB_6s_1_1_1_1.wav" --verbose

위 명령어를 통해서 두 .wav 파일 간의 음성 similarity를 0~5 사이의 값으로 표현할 수 있다.

profile
영차영차!!!

2개의 댓글

comment-user-thumbnail
2023년 5월 29일

하.. 컴파일이 미치도록 안된다 했더니.. bazel 구버전(5.0이하) 에선 bazel 이슈, 그 이상에선 bazel의 관리자 권한? 이 바뀌어서 관리자 cmd에 권한을 켜줘야 하는데, 켜줘도 여전히 권한 오류.. 결론은 bazel 및 python 속성->관리자 권한으로 실행 체크하고, 다시 cmd 에 관리자 권한으로(쫄려서 파워쉘로 가동) 돌리니.. 이제야 컴파일.. 꼬박 하루 밤새고.. 이제 컴파일 절반정도 되었는데 제발 오류 안뜨길 ㅠㅠ

1개의 답글