최근 모델 Pytohon

11693 단어 NumbatorchscriptPython

개시하다


주식회사 미래 번역 고객 성공 서비스@shhshn를 담당합니다.
일상적으로 사용하는 업무와 특별한 관계가 없다고 말하는 파이톤.
제품 개발에서 파이톤을 사용할 때 모델을 명시하는 것이 중요하다.
"파이톤으로 극대화"라는 말도 있는데, 주요 이유는 다음과 같은 두 가지다.
  • 정적 검사
  • 사용
  • 파이톤을 고속화하고 싶다
  • 전자는'드롭박스의 코디.'로 유명하지만 후자는 흔치 않다.
    이 글은 누마·타치스크립트 등 3가지 고속화 방법을 소개한다.

    Numba


    콘다의 유명한 아나콘다가 주도적으로 개발한 JIT 컴파일러다.
    from numba import jit
    import random
    
    @jit(nopython=True)
    def monte_carlo_pi(nsamples):
        acc = 0
        for i in range(nsamples):
            x = random.random()
            y = random.random()
            if (x ** 2 + y ** 2) < 1.0:
                acc += 1
        return 4.0 * acc / nsamples
    
    예를 들어 상술한 코드는 특별히 명확한 유형이 없지만 추론에 의하면 LLVM으로 컴파일된다.그 결과 C++에서 쓴 코드와 같은 속도를 발휘했다.C++에서 호출할 수도 있습니다.

    Numba의 이점

  • 기존 코드에 @jit를 추가하면 고속화
  • numpy와의 호환성이 높아 기본적으로 JIT화
  • 가능
  • @jit(nogil=True)에서 GIL을 제거하면 CPython의 한계를 돌파할 수 있다
  • Numba의 약점

  • Pythhon 언어 규범의 일부분만 지원
  • 최근까지dict없었어
  • 형 추론에 오류가 발생했을 때 원인을 규명하기 어렵다
  • TorchScript


    페이스북이 PyTorch의 일환으로 개발한 컴파일 기능이다.
    @torch.jit.script
    def scripted_fn(x : torch.Tensor):
        for i in range(12):
            x = x + x
        return x
    
    def fn(x):
        x = torch.neg(x)
        import pdb; pdb.set_trace()
        return scripted_fn(x)
    
    traced_fn = torch.jit.trace(fn, (torch.rand(4, 5),))
    traced_fn(torch.rand(3, 4))
    
    이 예는 두 가지 방법으로 유형 파이톤으로 처리된다.torch.jit.trace Numba처럼 함수를 전체적으로 추리한다.
    한편, @torch.jit.script mypy 형식으로 명시된 유형.

    TorchScript의 장점

  • 기본적으로 Python 언어 규범 지원
  • comporenhension 등이 안정적이고 순조롭게 대응
  • 형 추론 오류는 간단하고 알기 쉽고 친절하다
  • TorchScript의 약점

  • 공식 문서를 제외한 정보는 매우 희박하다
  • C++에서 호출할 때 코드 전체의 변형이 필요합니다
  • 파이톤의 다른 언어가 아니에요
  • 다른 언어 사용 옵션


    속도를 위주로 하는 스크립트 언어도 많다.예를 들어Julia 줄리아는 JIT에 대응하는 어느 날의 길이를 자주 비교한다.솔직히 파이톤의 문법, 생태계 등 미세한 차이를 제외한 다른 언어는 충분히 선택할 수 있다.
    그리고 처음부터 끝까지 C++로 쓴 빨대 스타일.보수적 운용(특히 인적자원)에 문제가 없다면 C++로 쓰는 것이 좋다.

    예: Python에서 C++로 컴파일


    https://github.com/shhshn/sonish(개념 검증 코드)
    최근 C++에도 유형 추론이 있기 때문에 디스플레이를 하지 않아도 파이톤에서 C++로 변환할 수 있습니다.
    def main():
        print("Hello and, again!")
        l = [3, 2]
        l.append(1)
        for x in l:
            print(x)
        d = {4: "HUGE", 5: "SUCCESS"}
        print(d[5])
    
    if __name__ == "__main__":
        main()
    
    예를 들어, 위의 Python을 동일한 출력의 C++로 변환할 수 있습니다.
    #include <iostream>
    #include <vector>
    #include <unordered_map>
    #include <iomanip>
    
    int main() {
    std::cout << std::setprecision(17) << "Hello and, again!" << std::endl;
    auto l = std::vector<int>{3, 2};
    l.push_back(1);
    for (auto x : l) {
    std::cout << std::setprecision(17) << x << std::endl;
    }
    auto d = std::unordered_map<int, const char *>{{4, "HUGE"}, {5, "SUCCESS"}};
    std::cout << std::setprecision(17) << d[5] << std::endl;return 0;
    }
    

    끝말


    파이톤의 인프라와 C++의 제품화 사이의 차이를 메우는 것에 대해 이야기했다.
    이 글은 참가했다향후 번역 Advent Calendar 2020.
    다음 AWS의 주인@kobarasukimaro이 또 등장한 것 같아요.
    그 전@reonyanarticle에 "CLI 제작 모듈 클릭에 대해서"!

    좋은 웹페이지 즐겨찾기