Julia는 무엇입니까? 수치 컴퓨팅에 대한 새로운 접근 방식

Julia는 수치 컴퓨팅을위한 무료 오픈 소스, 높은 수준의 고성능 동적 프로그래밍 언어입니다. 부분적으로는 네이티브 기계어 코드를 생성하는 LLVM 기반의 JIT 컴파일러 덕분에 컴파일 된 정적으로 형식화 된 언어의 성능과 부분적으로는 다중을 통한 전문화를 통해 형식 안정성을 구현하는 디자인 덕분에 동적 언어의 개발 편의성을 제공합니다. 효율적인 코드로 쉽게 컴파일 할 수 있습니다.

2012 년 Julia의 최초 출시를 알리는 블로그 게시물에서 언어의 저자 인 Jeff Bezanson, Stefan Karpinski, Viral Shah, Alan Edelman은 욕심 이 많기 때문에 Julia를 만드는 데 3 년을 보냈다고 말했습니다 . 그들은 Matlab, Lisp, Python, Ruby, Perl, Mathematica, R 및 C 간의 절충에 지쳤으며 과학 컴퓨팅, 기계 학습, 데이터 마이닝, 대규모 선형 대수학에 적합한 단일 언어를 원했습니다. , 병렬 컴퓨팅 및 분산 컴퓨팅.

Julia는 누구입니까? 연구 과학자와 엔지니어에게 매력적일뿐만 아니라, Julia는 데이터 과학자와 재무 분석가 및 퀀트에게도 매력적입니다.

이 언어의 디자이너와 다른 두 명은 2015 년 7 월에 Julia Computing을 설립하여 "Julia를 사용하기 쉽고 배포하기 쉬우 며 확장하기 쉬운 제품을 개발"했습니다. 이 글을 쓰는 현재, 회사는 28 명의 직원과 국립 연구소에서 은행, 경제학자, 자율 주행 차 연구자에 이르는 고객을 보유하고 있습니다. GitHub에서 Julia 오픈 소스 리포지토리를 유지하는 것 외에도 Julia Computing은 무료 및 유료 버전으로 제공되는 JuliaPro를 포함한 상용 제품을 제공합니다.

왜 Julia입니까?

Julia는 "단일 언어로 사용 편의성, 성능 및 효율성의 전례없는 조합을 만드는 것을 목표로합니다." 효율성 문제에 대해서는 아래 그래프를 고려하십시오.

줄리아 컴퓨팅

Julia 벤치 마크

여기서 우리가보고있는 것은 Julia 코드가 몇 가지 작업에서 C보다 빠를 수 있고 다른 작업에서는 C보다 몇 배 이상 느릴 수 없다는 것입니다. 예를 들어 R과 비교하면 일부 작업의 경우 C보다 거의 1,000 배 느릴 수 있습니다.

Julia에 대한 가장 느린 테스트 중 하나는 피보나치 재귀입니다. Julia는 현재 꼬리 재귀 최적화가 부족하기 때문입니다. 재귀는 본질적으로 루핑보다 느립니다. 프로덕션에서 실행하려는 실제 Julia 프로그램의 경우 이러한 알고리즘의 루프 (반복) 형식을 구현하고 싶을 것입니다.

Julia JIT 컴파일

JIT (just-in-time) 컴파일러 접근 방식에는 순수 인터프리터와 달리 비용이 발생합니다. 컴파일러는 코드를 실행하기 전에 소스 코드를 구문 분석하고 기계어 코드를 생성해야합니다. 즉, 세션에서 각 함수와 매크로가 처음으로 실행될 때 Julia 프로그램이 눈에 띄게 시작될 수 있습니다. 따라서 아래 스크린 샷에서 두 번째로 백만 개의 임의의 부동 소수점 숫자를 생성 할 때 걸리는 시간이 첫 번째 실행보다 훨씬 적다는 것을 알 수 있습니다. Julia 라이브러리는 Julia로 작성 되었기 때문에 @time매크로와 rand()함수 모두 코드를 통해 처음으로 컴파일해야했습니다.

줄리아> @time rand (10 ^ 6);

  0.62081 초 (14.44k 할당 : 8.415MiB)

줄리아> @time rand (10 ^ 6);

  0.004881 초 (7 개 할당 : 7.630MiB)

Julia 팬들은 Python, R 또는 Matlab을 쉽게 사용할 수 있다고 다양하게 주장합니다. Julia 언어는 우아하고 강력하며 과학 컴퓨팅을 지향하고 있으며 라이브러리는 광범위한 고급 프로그래밍 기능을 제공하기 때문에 이러한 비교는 면밀한 조사가 필요합니다.

Julia 예

간단한 Julia 언어 예제로서 다음 Mandelbrot 세트 벤치 마크 코드를 고려하십시오.

보시다시피 복소수 산술은 테스트 및 타이밍 용 매크로와 마찬가지로 언어에 내장되어 있습니다. 보시다시피, C와 유사한 언어를 괴롭히는 후행 세미콜론과 Lisp와 유사한 언어를 괴롭히는 중첩 된 괄호는 Julia에 없습니다. 참고 mandelperf()첫 번째 호출은 정확성에 대한 결과를 테스트하고 JIT 컴파일을한다 61, 62 라인, 두 번 호출됩니다; 두 번째 호출은 타이밍을 얻습니다.

줄리아 프로그래밍

Julia에는 언급 할 가치가있는 다른 많은 기능이 있습니다. 하나의 경우 사용자 정의 유형은 기본 제공만큼 빠르고 간결합니다. 실제로 전달되는 인수 유형에 대해 컴파일된다는 점을 제외하고 제네릭 유형처럼 작동하는 추상 유형을 선언 할 수 있습니다.

또 다른 예로 Julia의 내장 코드 벡터화는 프로그래머가 성능을 위해 코드를 벡터화 할 필요가 없음을 의미합니다. 일반적인 devectorized 코드는 빠릅니다. 컴파일러는 기본 CPU에있는 경우 SIMD 명령어 및 레지스터를 활용하고, 하드웨어가 허용하는 한 많이 벡터화하기 위해 순차적 프로세스에서 루프를 풀 수 있습니다. @simd주석을 사용하여 루프를 벡터화 가능으로 표시 할 수 있습니다 .

줄리아 병렬 처리

Julia는 또한 원격 참조와 원격 호출이라는 두 가지 기본 요소를 사용하여 병렬 처리 및 분산 계산을 위해 설계되었습니다. 원격 참조는  Future 및  RemoteChannel. A Future는 JavaScript와 동일합니다 promise. a RemoteChannel는 다시 쓸 수 있으며 Unix pipe또는 Go 와 같은 프로세스 간 통신에 사용할 수 있습니다 channel. 여러 프로세스와 줄리아를 시작했다고 가정하고 (예를 들어 julia -p 8인텔 코어 i7과 같은 여덟 코어 CPU 용)을 수행 할 수 있습니다 @spawn또는 remotecall()함수 호출이 비동기 적으로 다른 줄리아 공정을 실행하고, 나중에 fetch()(가) Future동기화 할 돌아 왔을 때와를 사용 결과.

다중 코어에서 실행할 필요가없는 경우 Task()줄리아 에서는 a, 다른 언어에서는 코 루틴 이라고하는 경량의 "녹색"스레딩을 사용할 수 있습니다. Task()또는 @taskA의 관련 작품 Channel의 단일 처리 된 버전이다 RemoteChannel.

줄리아 유형 시스템

Julia는 기본적으로 런타임 유형 추론을 통해 동적이지만 선택적 유형 주석을 허용하는 눈에 띄지 않지만 강력한 유형 시스템을 가지고 있습니다. 이것은 TypeScript와 유사합니다. 예를 들면 :

줄리아> (1 + 2) :: AbstractFloat

오류 : TypeError : typeassert : AbstractFloat 예상, Int64 가져 오기

줄리아> (1 + 2) :: Int

여기서 우리는 처음에는 호환되지 않는 유형을 주장하여 오류를 발생시키고 두 번째에는 호환 가능한 유형을 주장합니다.

줄리아 현

Julia는 UTF-8 형식으로 저장된 유니 코드 문자열 및 문자를 효율적으로 지원할뿐만 아니라 ASCII 문자를 효율적으로 지원합니다. UTF-8에서는 0x80 (128) 미만의 코드 포인트가 단일 문자로 인코딩되기 때문입니다. 그렇지 않으면 UTF-8은 가변 길이 인코딩이므로 Julia 문자열의 길이가 마지막 문자 인덱스와 같다고 가정 할 수 없습니다.

UTF-8에 대한 완전한 지원은 무엇보다도 그리스 문자를 사용하여 변수를 쉽게 정의 할 수 있음을 의미합니다. 따라서 과학적 줄리아 코드는 공식의 교과서 설명과 매우 유사하게 만들 수 있습니다 sin(2π). transcode()UTF-8을 다른 유니 코드 인코딩과 변환 하는 기능이 제공됩니다.

C 및 Fortran 함수

Julia는 래퍼 나 특수 API없이 C 및 Fortran 함수를 직접 호출 할 수 있지만 Fortran 컴파일러에서 내 보낸 "장식 된"함수 이름을 알아야합니다. 외부 C 또는 Fortran 함수는 공유 라이브러리에 있어야합니다. ccall()실제 호출 에는 Julia 함수를 사용합니다 . 예를 들어, Unix 계열 시스템에서이 Julia 코드를 사용하여 getenvlibc 의 함수를 사용하여 환경 변수의 값을 가져올 수 있습니다 .

getenv (var :: AbstractString) 함수

     val = ccall ((: getenv, "libc"),

                 Cstring, (Cstring,), var)

     만약 val == C_NULL

         error ( "getenv : 정의되지 않은 변수 :", var)

     종료

     unsafe_string (발)

종료

줄리아> getenv ( "SHELL")

"/ bin / bash"

줄리아 매크로

Julia에는 C 및 C ++에서 사용하는 매크로 전처리 기와 구별되는 Lisp와 유사한 매크로가 있습니다. Julia는 또한 리플렉션, 코드 생성, 심볼 (예 :) :foo및 표현 (예 :) :(a+b*c+1)객체 eval()및 생성 된 함수와 같은 기타 메타 프로그래밍 기능을 가지고 있습니다. Julia 매크로는 구문 분석시 평가됩니다.

반면에 생성 된 함수는 함수 컴파일 전에 매개 변수의 유형이 알려지면 확장됩니다. 생성 된 함수는 일반 함수 (C ++ 및 Java에서 구현 됨)의 유연성과 강력한 형식의 함수의 효율성을 갖습니다. 따라서 매개 변수 다형성을 지원하기 위해 런타임 디스패치가 필요하지 않습니다.

GPU 지원

Julia는 무엇보다도 MXNet 딥 러닝 패키지, ArrayFire GPU 어레이 라이브러리, cuBLAS 및 cuDNN 선형 대수와 딥 신경망 라이브러리, 범용 GPU 컴퓨팅을위한 CUDA 프레임 워크를 사용하여 GPU를 지원합니다. Julia 래퍼와 해당 라이브러리는 아래 다이어그램에 나와 있습니다.

줄리아 컴퓨팅

JuliaPro 및 Juno IDE

Julia 언어 사이트에서 Windows, MacOS, 일반 Linux 또는 일반 FreeBSD 용 무료 오픈 소스 Julia 명령 줄을 다운로드 할 수 있습니다. GitHub에서 Julia 소스 코드 저장소를 복제 할 수 있습니다.

또는 Julia Computing에서 JuliaPro를 다운로드 할 수 있습니다. 컴파일러 외에도 JuliaPro는 Atom 기반 Juno IDE (아래 참조)와 시각화 및 플로팅을 포함한 160 개 이상의 큐 레이트 패키지를 제공합니다.

무료 JuliaPro의 기능 외에도 엔터프라이즈 지원, 정량적 재무 기능, 데이터베이스 지원 및 시계열 분석을위한 구독을 추가 할 수 있습니다. JuliaRun은 클러스터 또는 클라우드를위한 확장 가능한 서버입니다.

Jupyter 노트북 및 IJulia

Juno를 Julia IDE로 사용하는 것 외에도 Julia 확장 (바로 아래에 표시됨)과 함께 Visual Studio Code를 사용하고 IJulia 커널 (아래 두 번째 및 세 번째 스크린 샷에 표시됨)과 함께 Jupyter 노트북을 사용할 수 있습니다. Anaconda 또는 pip를 사용하여 Python 2 또는 Python 3 용 Jupyter 노트북을 설치해야 할 수 있습니다.

JuliaBox

Julia Computing의 또 다른 제품인 JuliaBox (아래 표시)를 사용하여 로컬 컴퓨터에 설치하지 않고도 Jupyter 노트북에서 Julia를 온라인으로 실행할 수 있습니다. JuliaBox는 현재 300 개 이상의 패키지를 포함하고 Julia 0.6.2를 실행하며 수십 개의 자습서 Jupyter 노트북을 포함합니다. 튜토리얼 폴더의 최상위 목록은 아래와 같습니다. 무료 수준의 JuliaBox 액세스는 3 개의 CPU 코어로 90 분 세션을 제공합니다. 월 14 달러 개인 구독은 5 개의 코어로 4 시간 세션을 제공합니다. 월 $ 70 프로 구독은 32 코어로 8 시간 세션을 제공합니다. GPU 액세스는 2018 년 6 월부터 아직 사용할 수 없습니다.

줄리아 패키지

Julia "Python처럼 걷지 만 C처럼 실행합니다." 제 동료 Serdar Yegulalp가 2017 년 12 월에 쓴 것처럼 Julia는 데이터 과학 프로그래밍을 위해 Python에 도전하기 시작했으며 두 언어 모두 장점이 있습니다. Julia의 데이터 과학에 대한 지원이 빠르게 성장하고 있음을 나타 내기 위해 Julia for Data Science 라는 제목의 책이 이미 두 권 있습니다 . 하나는 Zacharias Voulgaris가, 다른 하나는 Anshul Joshi가 저술했습니다. 하나.

아래에 표시된 Julia Observer의 전체적으로 최고 등급의 Julia 패키지를 살펴보면 Jupyter 노트북 용 Julia 커널, Gadfly 그래픽 패키지 ( ggplot2R에서 와 유사 ), 일반 플로팅 인터페이스, 여러 딥 러닝 및 머신을 볼 수 있습니다. 학습 패키지, 미분 방정식 솔버, DataFrames, New York Fed 동적 확률 적 일반 평형 (DSGE) 모델, 최적화 모델링 언어, Python 및 C ++에 대한 인터페이스. 이 일반 목록을 조금 더 아래로 내려 가면 QuantEcon, PyPlot, ScikitLearn, 생물 정보학 패키지 및 함수 프로그래밍을위한 지연 목록 구현도 찾을 수 있습니다.

Julia 패키지가 귀하의 요구에 충분하지 않고 Python 인터페이스가 원하는 곳으로 이동하지 못하는 경우 R (RCall) 및 Matlab에 대한 일반 인터페이스를 제공하는 패키지를 설치할 수도 있습니다.

재무 분석가 및 퀀트를위한 Julia

Quants 및 재무 분석가는 아래 스크린 샷에 표시된 것처럼 작업 속도를 높이기 위해 많은 무료 패키지를 찾을 수 있습니다. 또한 Julia Computing은 Miletus (금융 계약을위한 DSL),  JuliaDB (고성능 인 메모리 및 분산 데이터베이스),  JuliaInXL (Excel 시트에서 Julia에게 전화) 및 Bloomberg 연결 (실제 액세스에 대한 액세스 )  로 구성된 JuliaFin 제품군을 제공합니다. -시간 및 과거 시장 데이터).