줄리아 는 다양한 유용한 수치 해석 도구가 내장된 고성능 프로그래밍 언어입니다. 작성하기 쉽고 과학 계산, 머신 러닝 등을 위한 유용한 패키지 생태계가 빠르게 성장하고 있습니다. Julia는 JMP와 마찬가지로 과학자, 연구원 및 엔지니어에게 매우 귀중한 도구입니다.
Julia는 다른 프로그래밍 언어와의 뛰어난 상호 운용성으로 정평이 나 있는데, JSL에서 Julia를 호출하는 것이 얼마나 어려울지 궁금했습니다. 만약 가능하다면 (실제로 가능합니다!), JSL에서 Julia를 호출하는 데에는 많은 잠재력이 있다고 생각합니다. 예를 들어, 고성능 Julia 프로그램을 호출하는 대화형 JMP 사용자 인터페이스를 구축할 수 있습니다. Julia에서 모델을 만들고 JMP에서 결과를 시각화하거나 그 반대로도 가능합니다. JMP 워크플로에서 속도가 느린 부분을 Julia에서 처리할 수도 있습니다.
JSL에서 Julia를 호출하는 두 가지 방법을 설명하겠습니다. 첫 번째 방법은 JSL을 사용하여 Python을 호출하고, Python이 다시 Julia를 호출하는 것입니다. 두 번째 방법은 C 언어로 작성된 동적 링크 라이브러리(DLL)에 Julia를 내장하는 것입니다.
참고로, 이 글에서는 줄리아 프로그래밍에 대한 자세한 내용은 다루지 않을 예정입니다. 줄리아에 대해 더 알고 싶으시다면 공식 문서를 참고하시거나, 줄리아 아카데미 에서 제공하는 학습 자료를 확인해 보세요.
파이썬을 통해 줄리아 호출하기
JSL의 Python
JMP 14에서는 Python과 직접 연동하기 위한 JSL 명령어가 추가되었습니다. 스크립팅 색인에서 발췌한 간단한 예제는 다음과 같습니다.
// Initialize the Python interface
PythonInit();
// Submit some Python code to run as a JSL string
PythonSubmit("\[message = 'The quick brown fox jumps over the lazy dog']\");
// message is now a variable in Python and can be accessed from JSL with PythonGet()
getStr = PythonGet(message);
Show(getStr);
// Terminate the Python interface
PythonTerm();
피줄리아
파이썬에서 줄리아를 호출할 수 있다면 JSL에서도 줄리아를 호출할 수 있을 것입니다. 피줄리아 는 바로 이러한 기능을 제공하는 파이썬 패키지입니다. 이제 설정해 보겠습니다. 참고: 저는 Mac 환경에서 Julia 1.5.4, Python 3.9.5, PyJulia 0.5.7, JMP 16.1을 사용하여 성공적으로 설정했습니다.
파이썬이 정상적으로 설치되어 있다고 가정하면 설정은 다음과 같습니다.
아직 Julia를 설치하지 않았다면 설치하세요. 설치 방법은 공식 바이너리용 플랫폼별 설치 지침을 참조하세요. 최신 버전은 Julia 다운로드 페이지 에서 다운로드할 수 있습니다.
다음으로, 안내 에 따라 PyJulia를 설치하세요.
일반적인 파이썬 세션에서 PyJulia의 사용 설명서를 이해할 수 있다면, 바로 시작하실 수 있습니다!
JSL의 PyJulia
JSL을 사용하려면 먼저 Python 세션에서 Julia를 초기화해야 합니다. 아래와 같이 런타임 키워드 인수로 Julia 실행 파일의 경로를 전달해야 합니다.
Python Init();
// Initialize julia
Python Submit(
"\[
from julia import Julia
Julia(runtime="/usr/local/bin/julia")
]\");
여기에서 Python Submit을 사용하여 모든 Julia 코드를 실행할 수 있습니다.
// Import the main module. This is Julia's workspace.
Python Submit("\[
from julia import Main
Main.xs = [1,2,3] # xs belongs to julia
sines = Main.eval("sin.(xs)") # This returns the sine of each element in xs
]\");
show(PythonGet(sines)); // [0.841470984807897 0.909297426825682 0.141120008059867]
다른 줄리아 패키지가 설치되어 있다면 파이썬 import를 통해 접근할 수 있습니다. 여기서는 Pandas.jl, DataFrames.jl, Lasso.jl을 사용하여 Big Class.jmp 데이터에 대한 키 예측을 위한 라쏘 피팅을 실행했습니다. 그런 다음 JMP Graph Builder를 사용하여 실제 값과 예측 값을 그래프로 나타냈습니다.
// Convert datatable to julia dataframe
// Must convert it to a julia Pandas dataframe first
dt = open("$SAMPLE_DATA/Big Class.jmp");
Pythonsend(dt);
Python Submit(
"\[
from julia import Pandas
from julia import DataFrames
from julia import Lasso
Main.dt = dt
predicted = Main.eval("""
using Lasso
df = DataFrames.DataFrame(Pandas.DataFrame(dt))
m = fit(LassoModel, @formula(height ~ sex + weight), df)
predict(m, df)
""")
]\");
// Back to JMP where we plot Actual vs. Predicted
predicted = pythonget("predicted");
dt << newColumn("Predicted height", <
<SETVALUES></SETVALUES>
<P class="lia-align-center" style="text-align: center;" style="text-align: center;"><FONT size="2"><EM>Julia에서 계산된 결과를 보여주는 실제값과 예측값 그래프를 그래프 빌더로 나타낸 그림입니다.</EM></FONT></P> <P><SPAN class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="plot.png" style="width: 385px;"><span class="lia-inline-image-display-wrapper" image-alt="plot.png" style="width: 385px;"><img src="https://us.v-cdn.net/6038925/uploads/images/41854i1D3222BA026053FF/plot.png" role="button" title="plot.png" alt="plot.png" /></span><SPAN class="lia-inline-image-caption" onclick="event.preventDefault();">플롯.png</SPAN></SPAN></P> <BR /> <P><FONT size="5">DLL에 Julia 내장하기</FONT><BR /> <A href="https://docs.julialang.org/en/v1/manual/embedding/" target="_self" rel="nofollow noopener noreferrer">Julia를 C 코드에 내장하는 것도</A> 가능합니다. 간단한 예제를 몇 가지 공유하겠지만, C에 더 익숙한 분이라면 더 심화된 예제를 구현할 수 있을 것입니다.</P> <P><STRONG><FONT size="4">LoadDLL</FONT></STRONG><BR /> 여기서 핵심은 JSL의 <FONT face="courier new,courier">LoadDLL</FONT> 함수입니다. <FONT face="courier new,courier">LoadDLL</FONT> 함수 사용법을 배우기에 좋은 자료는 <A href="https://www.lexjansen.com/nesug/nesug10/ad/ad04.pdf" target="_blank" rel="noopener nofollow noreferrer">이 논문</A> 입니다. 간단한 예로, test.c 파일에 있는 다음 C 함수를 살펴보겠습니다.</P> // test.c
double myMultiply(double num1, double num2)
{
return num1 * num2;
} 그리고 DLL로 컴파일합니다.
# On Mac
gcc -shared -o test.dylib test.c
# On Windows
gcc -shared -o test.dll test.c
그런 다음 JMP에서 C 함수를 호출할 수 있습니다.
dll = loadDLL(convertfilepath("/path/to/my/test.dylib"));
dll << declareFunction("myMultiply",
Convention( STDCALL ),
Arg(Double, "num1"),
Arg(Double, "num2"),
Returns( Double )
);
show(dll << myMultiply(Pi(), 100));
dll << unloadDLL; 줄리아 DLL
이제 Julia가 내장된 DLL을 살펴보겠습니다. 입력값이 도 단위일 때, 그 값의 사인값을 계산하는 함수를 만들어 보겠습니다.
// call_julia.c
#include
double sineInDegrees(double degrees)
{
// required: setup the Julia context
jl_init();
// You can evaluate Julia code from strings
jl_value_t *factor = jl_eval_string("pi/180");
double factor_unboxed = jl_unbox_float64(factor);
double radians = degrees * factor_unboxed;
// You can call Julia functions directly
jl_function_t *func = jl_get_function(jl_base_module, "sin");
jl_value_t *argument = jl_box_float64(radians);
jl_value_t *ret = jl_call1(func, argument);
double ret_unboxed = jl_unbox_float64(ret);
jl_atexit_hook(0);
return ret_unboxed;
}
Mac에서 컴파일하려면 아래 명령어를 실행하세요. 여기서 $JULIA_DIR은 Julia 바이너리의 경로를 지정하는 환경 변수입니다. 제 경우에는 /Applications/Julia-1.7.app/Contents/Resources/julia였습니다. Windows에서는 시도해 보지 않았지만, 비슷한 방식으로 작동할 것입니다.
# On Mac
gcc -shared -o call_julia.dylib call_julia.c -fPIC -I$JULIA_DIR/include/julia -L$JULIA_DIR/lib -Wl,-rpath,$JULIA_DIR/lib -ljulia
이제 JSL에서 sineInDegrees를 호출할 수 있습니다!
dll = loadDLL(convertfilepath("/path/to/my/call_julia.dylib"));
dll << declareFunction("sineInDegrees",
Convention( STDCALL ),
Arg( Double, "degrees" ),
Returns( Double )
);
show(dll << sineInDegrees(90)); // 1
dll << unloadDLL; 결론
JSL의 Python 및 LoadDLL 인터페이스를 사용하면 JMP를 넘어 Julia를 호출할 수 있습니다. 이를 구현하는 데 시행착오가 좀 있었지만, 일단 설정이 완료되면 상당히 잘 작동합니다. 이 글에서는 몇 가지 간단한 예제를 보여드렸지만, JMP와 Julia를 결합하여 새롭고 흥미로운 애플리케이션을 개발할 수 있는 잠재력이 있다고 생각합니다.
읽어주셔서 감사합니다. 유익한 정보를 얻으셨기를 바라며, 더 탐구해보고 싶은 마음이 생기셨기를 바랍니다.
버전에 대한 참고 사항
Mac에서 Julia 1.5와 Julia 1.8 베타 버전을 사용했을 때만 Python을 통해 Julia를 실행할 수 있었습니다. Windows에서는 Python을 통한 Julia 사용에 성공하지 못했는데, Mac만큼 다양한 버전을 시도해보지는 않았기 때문입니다. 모든 테스트에는 JMP 16을 사용했습니다.