Julia에서 실행 파일을 만는 이유는 배포의 편의성과 모듈 및 함수를 미리 컴파일하여 빠르게 실행하고자 함이다.
최근까지 Julia에서 실행 파일을 만드는 일은 쉬운일이 아니었다. 하지만 현재 PackageCompiler라는 패키지가 많이 개선 되어 아주 쉽게 만들 수 있다.
아직 까지 실행 파일을 생성하는데는 시간이 비교적 많이 걸린다.
좋은 점은 Linux,Windows,Mac을 다 지원한다는 것이다.
지금 부터 PackageCompiler를 설치하고 사용하는 방법을 설명한다.
여기서 설명하는 PackageCompiler 버전은 1.2.0, Julia는 1.3.1 이상의 버전을 기반으로 한다.
PackageCompiler GitHub : https://github.com/JuliaLang/PackageCompiler.jl/
PackageCompiler의 내부 동작을 잘 이해 하려면 문서를 꼭 참조 하기 바란다.
Doc : https://julialang.github.io/PackageCompiler.jl/dev/
PackageCompiler 설치
Pkg> add PackageCompiler#master
여기서 사용할 예제는 CSV package를 사용하여 csv 파일을 읽어 오는것으로 아래에 첨부 해둔다.
첨부파일 : MyApp2 예제
MyApp2 Project 만들기
$ mkdir MyApp2
$ cd MyApp2
$ mkdir src
$ cd src
$ vi MyApp2.jl : MyApp2.jl 소스를 작성한다. 소스는 첨부 파일 참조
$ cd ..
$ julia -q --project=.
julia> ]
Project.toml,Manifest.toml이 생기고 아래 추가하는 패키지 및 관련정보가 추가된다.
pkg> activate .
pkg> add CSV
Pkg> add Pkg
생성된 Project.toml에 MyApp2 패키지에 대해 아래와 같이
name, authors, version 등 정보를 기록 한다.
예시)
name = “MyApp2”
authors = [“mrchaos”]
version = “0.1.0”
위와 같이 Project.toml에 패키지 정보를 기록한 후 아래와 같이 using MyApp2를 하게 되면
uuid가 생성되는데. 이 uuid정보를 Project.toml에 추가한다.
julia> using MyApp2
[ Info: Precompiling MyApp2 [86d39c7e-c2c2-5089-bc92-111ed610fa0f]
위에서 생성된 uuid를 추가한 Project.toml 파일은 아래와 같다. (첨부파일 참조)
name = “MyApp2”
uuid = “86d39c7e-c2c2-5089-bc92-111ed610fa0f”
authors = [“mrchaos”]
version = “0.1.0”
마지막으로 Precompile을 할 package와 함수 예제를 작성한다. 이렇게 하는 이유는 위에 링크되어 있는 PackageCompiler의 문서를 꼭 읽어 보기 바란다.
첨부된 precompile_app.jl (이름은 마음대로 지어도 된다) 파일을 참조 하면된다. 이 파일이 PackageCompiler가 무엇을 precompile할지에 대한 목록을 제공 한다.
PackageCompiler는 precompile_app.jl 파일을 실행해서 precompile할 목록을 내부적으로 뽑아내고 precompile을 한다.
※ 주의할점 : precompile_app.jl 파일에서 ARGS 즉 입력 파라미터로 파일명을 넣는 부분이 있는데 full path를 넣어 주어야 한다. 그렇지 않으면 내부적으로 파일을 잘 찾지 못해 precompile할 목록을 생성하지 않아 CSV.read 호출시 precompile을 하여 속도가 느려 진다.
예) push!(ARGS, “/home/shpark/julia_test/NewSysImageEnv/MyApp2/FL_insurance_sample.csv”)
위의 precompile_app.jl 파일 까지 만들었다면 아래와 같이 create_app을 실행하면 실행 파일이 생성된다.
create_app의
1) 첫 번째인자 “.” 는 project가 있는 위치를 가리키는데 현재 MyApp2 폴더내에서 julia -q –project=. 으로 실행 했기 때문이다
MyApp2보다 상위 폴더에서 julia를 실행 했다면 첫번째 인자에 “MyApp2″를 넣어 주면된다.
2) 두 번째인자 “build”는 실행 파일이 생기는 폴더를 가리킨다. 이 폴더 안에 “bin”,”lib” 폴더가 생기는데 “bin”폴더에 MyApp2 라는 실행 파일이 생긴다.
“lib” 폴더에는 실행에 필요한 라이브러리들이 복사된다.
3) 세 번째인자 “precompile_execution_file=”precompile_app.jl” 는 위에서 설명한 대로 precompie할 목록을 뽑을 수 있는 파일이다.
4) 네 번째인자 “force=true” 다시 실행파일을 빌드 할 때 지정된 “build”폴더를 전부 삭제 하고 새롭게 빌드 하도록 한다.
빌드 하는데 시간이 꽤 오래 걸린다. 추 후 개선 될 것이라고 본다.
julia> using PackageCompiler
julia> create_app(".","build",precompile_execution_file="precompile_app.jl",force=true)
julia> exit()
폴더 tree 구조는 다음과 같다
빌드 후 제대로 동작하고 속도가 빠른지 테스트 하기 위해 “FL_insurance_sample.csv”을 얼마나 빨리 읽어 오는지 본다.
제대로 빌드 되었다면 0.1초도 걸리지 않는다.
FL_insurance_sample.csv 파일을 build/bin 폴더에 복사 하고 아래와 같이 테스트 해본다.
$ cp FL_insurance_sample.csv ./build/bin
$ cd build/bin
$ ./MyApp2 FL_insurance_sample.csv
0.016188 seconds (1.95 k allocations: 10.835 MiB)
FL_insurance_sample.csv: 36634x18
$ time ./MyApp2 FL_insurance_sample.csv
0.013723 seconds (1.95 k allocations: 10.835 MiB)
FL_insurance_sample.csv: 36634x18
real 0m0.343s
user 0m0.563s
sys 0m0.611s
위의 결과를 보면 예상 대로 아주 빠르게 실행 되었음을 알 수 있다.
만약 재대로 precompile이 되지 않고 빌드 되었다면 20초 이상이 걸린다.
참고 MyApp2에서 사용하도록 생성된 .so 파일을 Julia에서 불러서 테스트 해 볼 수 있다.
bin 폴더에서 julia를 실행한다.
$ julia -q -JMyApp2.so
julia> @time using CSV
0.000577 seconds (867 allocations: 43.141 KiB)
julia> @time CSV.read("FL_insurance_sample.csv");
0.011800 seconds (1.90 k allocations: 10.831 MiB)
핑백: [Julia] Julia project creation with PkgTemplates package – Power UP!