멀티프로세싱을 사용하려고 찾아보고있습니다 지금까지 이해하기로 input이 다른 동일한 함수를 각 cpu로 동시에 계산하는걸로 알고있는데요 print 함수에서 설명하시길 multi가 더 오래걸렸다고 하셨는데 multi는 동일 작업 8개를 동시에 수행하여 13초가 걸렸고 single은 12초가 걸렸는데 이게 어떻게 속도가 느려진거라고 말씀하시는지 의아하네요.. 14:16 보시면 8개의 single함수가 동시에 돌아가고있는거 아닌가요?
@MutexLock10 ай бұрын
제가 군입대한 이후에 채널 관리를 잘 못하고 있기도 했고 상황이 그렇게 좋지 못해 답변을 미처 못 드리고 있었습니다. 이 점 대단히 죄송합니다. 그리고 영상 시청하고 질문 남겨주신 점에 대해서는 매우 감사하게 느낍니다. 질문을 보니 상황이 헷갈릴 수도 있다는 생각이 듭니다. Single, multi 모두 1부터 10000000까지의 합을 구하는 것이 목적입니다. 제 생각에는 상황을 multiprocessing의 각 코어들이 모두 1~10000000의 합을 구하는 것으로 생각하신 것 같습니다. 하지만 그러한 사항이 아니라, 1~10000000의 합을 구하는 과정에 있어서 - single은 1~10000000까지 순차적으로 더하고 - multi는 덧셈의 구간을 1/n (영상에선 n=16) 씩 나눠 1~10000000/n, …, 1 + 1*10^7*(n-1)/n~10000000의 합을 먼저 구하고 이렇게 도출된 n개(기대적으로 매우 작은 수)의 결과를 다시 한 번에 합산하는 과정 이기 때문에 multi가 계산 속도에서 약 n배 빠를 것이다라는 기댓값을 가지는 상황입니다. 따라서 1~1*10^7까지의 모든 수를 더하는 행위를 multicore의 수만큼 진행하는 것이 아닌 결론적으로는 single, multi 모두 1번 수행하는 상황입니다. 실제적으로 계산 결과는 훨씬 더 빨리 나오지만 그 계산 결과가 우리 눈에 보이기 까지는 print 함수를 거쳐야 합니다. 그런데 이 print 함수가 감당 가능한 수준의 출력양을 넘어버려 발생하는 병목현상 때문에 우리 눈에 보이기까지의 시간이 매우 오래 걸려버린 상황입니다. 이렇게 늦게나마 자세하게라도 추가 설명을 드렸습니다. 이해가 잘 되셨으면 좋겠습니다! 그리고 늦은 답변 너무 죄송합니다. 다음에는 더욱 빨리 답변드릴 수 있도록 하겠습니다.
@heulen.10 ай бұрын
@@MutexLock 헐 너무너무 반갑고 담변 정말 감사드립니다. 덕분에 멀티프로세싱 너무 유용하게 잘 사용하고 있어요 ㅎㅎㅎ 영상보면서 오해를 심하게 했었군요 ㅋㅋㅋㅋ 자세히 설명해주셔서 감사합니다 군복무중이시라니 나라 지켜주셔서 감사합니다..! 덕분에 두 다리 쭉 뻗고 잡니다! 화이팅!
@jaeyounglee574 Жыл бұрын
좋은 강의 감사합니다. 프로세스 데이터 교환을 프로세스가 병렬 실행되는 동안 연결하고 싶은데 그 중에 코드가 긴 프로세스는 상대적으로 1루프 계산 결과가 느려질텐테 이런 데이터 싱크도 별도로 맞춰 나가야 할까요? 현재 영상 데이터를 받아 픽셀 처리를 기반으로 로봇 HW 제어를 실시간으로 하려고 합니다. 이 구조에 iteration 을 통한 알고리즘 계산이 또 별도로 있어요 ^^;; 이처럼 실행이 무거운 알고리즘은 적당히 나눠서 core 할당 하고 데이터 흐름을 연결하면 그나마 빨라질지 모르겠네요
@jaeyounglee574 Жыл бұрын
프로세서로 멀티 태스킹 처리하여 해결 하였습니다
@user-mv7im3gv1n2 жыл бұрын
설명을 엄청잘하시네요 ㅎㅎ잘듣고갑니다.강사님
@MutexLock2 жыл бұрын
시청해주셔서 감사합니다~ 더욱 좋은 설명을 할 수 있도록 더 노력하겠습니다! ㅎㅎ (강사는 아니고 취미로 올리는 영상입니다 ㅋㅋㅋ)
@holymoly1082 жыл бұрын
질문 드립니다! 모든 cpu 코어(코어의 하드웨어적인 스레드)를 사용하게 멀티 프로세스 코드를 작성한다는 건 컴퓨터가 내 코드만 실행시킨다는 가정을 하고 프로그램을 만든 거 아닌가요? 컴퓨터는 다른 프로그램 코드도 실행시켜야 하고 다른 네트워크 통신도 해야하는 데요. 잘 몰라서 질문드립니다ㅠㅠ 만약 여덟 개의 코어를 작동시키려 하는데, 한 코어가 다른 프로그램을 돌리고 있으면.. 여덟 코어를 통해 완성하려 했던 전체 작업이 늦게 완료 되는 건가요? (일곱 코어는 맡은 바를 완료했으나 작업시작이 늦은 하나의 코어가 완료가 매우 늦게 되는 건 아닌가요?) 유용한 강의 만들어주셔서 정말 감사드립니다!
@MutexLock2 жыл бұрын
질문 주셔서 감사드립니다~ 아주 날카롭고 좋은 질문이에요! 당연히 의문이 드실 수 있을 겁니다. 실제로 어떤 프로그램을 실제 실행시켜 메인 메모리에 올린 상태 혹은 그 단위를 프로세스라고 부르게 되는데요. holy moly님께서 작업관리자(윈도우)에 들어가 보시면 현재 실행중인 프로세스가 몇 십개 몇 백개가 있을 겁니다(실제 보여지지 않는 백그라운드에서 돌아가는 프로세스까지 하면 몇 백에서 몇 천개가 됩니다). 이렇게 많은 프로세스를 전부 CPU가 감당하기에는 CPU의 하드웨어가 너무 제한적입니다. CPU의 코어가 몇 백개씩 있으면 좋으련만, 그렇지 못하잖아요? 이렇게 해서 등장한 개념이 바로 'Concurrency' (동시성)입니다. 이 Concurrency의 개념은 Parrelism (병렬성)과 조금 다릅니다. CPU 내 하나의 Hardware Thread가 여러 개의 Process를 실행시켜야 하므로 여러 개의 Process를 약 1~5ms (ms였나 μs였나 기억이...) 마다 다른 Process로 교체해줍니다. 이렇게 주기적으로 빨리 Process를 교체해줌으로써 우리 인간의 눈에 마치 동시에 Process가 실행되는 것처럼 보이게 만드는 것이 'Concurrency'입니다. 이러한 Concurrency가 모든 코어에 'Parallel'하게 적용이 된다고 생각하시면 좋을 것 같습니다. (추가 설명은 저의 다른 영상인 A CPU Architecture and Understanding of Multiprocessing의 36:52 (Context Switch)부분을 참고해주세요!) 그렇기 때문에 이렇게 Python에서 Multiprocessing Programming을 해서 Process를 만들게 되면 각 코어에 Process가 할당이 되어서 주기적으로 잘 돌아갑니다. 요즘 OS는 제가 알기론 Process가 생성되면 우선순위가 가장 높아지는 걸로 알고 있어요(확실하진 않아요). 사실 이것도 Windows, MacOS, Linux에 따라서 이 Process를 어떻게 관리하는지가 전부 달라요(아직도 연구중인 연구분야 중에 하나입니다). 그래서 질문주신 상황에 빗대어 생각해본다면, 각 프로세스가 완전히 동일한 task를 담당한다면 아무리 늦어도 수십 ms (or μs) 내의 차이만 존재한다고 할 수 있습니다. 사실 더 깊게 들어가면 8개의 Process가 있고 CPU가 Octa-core라고 가정했을 때, 완벽하게 8개의 코어에 정확히 분배하지 않을 수도 있고 코어간의 프로세스가 이전될 수도 있고 그런데, 뭐 그런 기술들이 있습니다. 특히나 이 질문과 이 기술이 더욱 더 중요해지는 이유는 요즘의 ARM 기반 CPU(Mac Book의 M1, Snapdragon 내장 CPU등의 모바일 CPU 등등)는 big.LITTLE 구조를 가진 경우가 늘어나고 많아지고 있습니다. big.LITTLE 구조는 무거운 업무를 위한 좋은 CPU core와 가벼운 업무를 위한 상대적으로 덜 좋은 CPU core를 동일 CPU 내에 같이 집어넣는 기술입니다. 그래서 이 Big-Core와 LITTLE-Core의 특성에 따라서 어떻게 Process를 주기적으로 변경해주고, 다른 코어로 Process 이전을 할 것인지에 대한 연구가 필요하기 때문입니다. 그리고 현재 활발히 연구되고도 있구요. 뭐 제가 알려드리고 싶은 게 많다보니 적다보니 또 너무 길어졌네요. 이 정도면, 충분히 답이 되었으리라고 봅니다. 감사합니다!
@holymoly1082 жыл бұрын
@@MutexLock 코어에서 여러 프로세스를 concurrent하게 주기적으로 교체하며 수행하는 거군요! 코어에서 하나의 프로세스만 전담으로 할 거라고 제한된 사고를 했네요..ㅎㅎ;; 옥타코어에서 8개의 코어에 균일하게 분배되지 않거나 다른 코어에 나눠줄 수 있다는 사실은 말씀해주셔서 알게 되었습니다. 정말 감사드립니다. 부족한 점이 많은데 자세한 답변 해주셔서 많이 도움을 받았습니다ㅠㅠ 말씀해주신 영상도 꼭 시청하고 댓글 남기겠습니다!
@davidcho93874 ай бұрын
요즘엔 멀티프로세싱에 ray 많이 쓰더라구요~ 이미 알고 계시겠지만 다른 분들을 위해 ray라는 라이브러리도 있다고 댓글 남겨봅니다
@user-uk2ej2re9r3 жыл бұрын
많은 도움이 되었습니다. 감사합니다.^^
@MutexLock2 жыл бұрын
도움이 되었다니 정말 감사합니다! 다른 영상도 많이 시청해주세요! :)
@user-uk2ej2re9r2 жыл бұрын
@@MutexLock 감사합니다.^^
@1minstoryteller2 жыл бұрын
크~ 좋네요
@minsuksung2 жыл бұрын
감사합니다. 일반적으로 프로세스끼리 데이터 통신할땐 Queue를 이용하면 될까요?
@MutexLock2 жыл бұрын
답글이 늦어서 죄송하고, 댓글 감사드립니다. Queue를 사용하는 게 가장 간단하지만, 데이터가 너무 많거나 그럴 경우에는 효과적이지 못 합니다. 또한, 이와 관련해서 Queue만 사용하는 방식은 한계가 있을 수 있습니다. python은 그 외의 방식으로도 built-in module로써 shared_memory라는 module을 지원하고 있습니다. 해당 링크를 참고해주세요! docs.python.org/3/library/multiprocessing.shared_memory.html 감사합니다!
@user-es6ts9nz1d3 жыл бұрын
결과값을 받아서 이후 다시 다른 함수에 사용해야 핸다면 lock? 록을 익혀야 된다는 말이죠/?
@MutexLock2 жыл бұрын
최근에 매우 바빴어서 답장을 못했습니다. 죄송합니다! ㅠㅠ 관심을 가져주셔서 너무 감사합니다! 맞습니다! Lock을 익혀야 합니다! 대중적인 Lock의 종류에는 Mutex Lock, Spinlock 2가지 종류가 있습니다! (그 외에도 아주 많습니다!) 곧 제가 C언어를 이용해 Mutex Lock에 대한 강의를 한 영상이 올라갈 예정입니다! Python은 아니지만, 모든 언어를 관통하는 이론을 비롯해 코딩으로 보여드리는 강의입니다! 보기만 하더라도 Python Lock에 대해서는 매우 쉽게 접근하실 수 있으실 겁니다. 왜냐하면, 제가 알기로는 Python Multiprocessing은 Lock이라는 클래스로 전부 퉁치는 걸로 알아요. 감사합니다!
@MrSongangelo2 жыл бұрын
5:25 병렬로 작업한 멀티프로세싱 중 먼저 종료 된 프로세스에서 이벤트를 발생시켜서 서로간의 프로세스에 종료 되었다는것을 전달하는 방법은 없나요?
@MutexLock2 жыл бұрын
답글 달아주셔서 감사합니다~ 애초에 시간이 거의 차이 나지 않거나 차이 나도 상관이 없는 경우에만 저러한 방식으로 구현하게 됩니다. 서로 프로세스가 종료되었다는 사실만을 전달하기만 하면 된다면, Queue의 길이를 확인하는 방식으로 알 수 있습니다. (예를 들어, Process A가 끝나기 직전에 Queue에 값을 집어 넣으면, Process B가 Queue 길이를 확인헀을 떄 늘어났음을 인지하면 프로세스가 종료되었다는 사실을 인지하게 되는 거겠죠? 다만, '서로 간에' 이기 때문에 Process A, Process B가 모두 Queue 길이를 주기적으로 체크하는 코드가 필요하겠습니다. 결국은 어떤 방식으로 구현하더라도 '나 Process 끝났어'라는 신호를 보내면, 다른 Process가 '알겠어, 확인했어'라고 받아주는 코드가 서로 가지고 있어야 합니다. 프로세스 종료를 전달하는 것 자체가 Process 간에 연관이 되어버린다고 해석할 수 있으므로 프로그램의 성능 저하에 영향을 줄 수도 있을 것 같네요.) 그 외에도 Semaphore라는 개념이 있는데, 어떤 Process 또는 Thread가 타 Process들 또는 Thread들의 작업이 완료가 될때까지 기다리도록 구현할 수도 있습니다(나중에 시간이 되면 다루겠습니다).
@user-bb8ei1jt6q3 жыл бұрын
안녕하세요 업무에서 자료처리에서 파이썬을 주로 이용하고 있는 직장인입니다 올려주신 영상 잘 보았는데요 혹시 여러개의 파이썬 파일을 동시에(병렬로) 실행시키고 싶을때가 있는데 관련해서 자문을 부탁드려도 될까요? 오늘도 좋은 하루 되세요!
@MutexLock3 жыл бұрын
안녕하세요~ 영상 잘 봐주셔서 감사합니다 ☺️ 여러개의 파이썬 파일을 당연히 동시에 실행시킬 수 있습니다. 하지만, 먼저 여쭤보고 싶은 부분은, Python을 사용하는 환경이, Windows, Linux, Mac OS 중에 어떤 운영체제를 사용중이시고, 또 실행시 IDE를 이용해서 자체적으로 실행시키시는지 아니면 Terminal(Window의 경우, Command Line)을 이용하는지 먼저 여쭤봐도 될까요?
@user-bb8ei1jt6q3 жыл бұрын
@@MutexLock 안녕하세요 늦은시간에 답변 감사합니다 일단 업무환경은 기본적으로 windows 10 에서 cmd 창에서 많이하는편이고 대용량 처리가필요할땐 회사 서버환경(리눅스, ubuntu 18.0.4정도 ? ) 에서 하고있습니다~
@MutexLock3 жыл бұрын
@@user-bb8ei1jt6q 제가 이렇게 말씀을 여쭤본 이유는, Terminal 창에 익숙하지 않으신 분들은 설명해드릴 방법이 조금 어려울 수도 있기 때문이에요. 그리고, cmd 창과 terminal의 명령어가 또 다르거든요... ㅎㅎ Termial에는 어느 정도 익숙해보이신 걸로 보여서 설명드리도록 할게요. 솔루션은 다음과 같아요. - Subprocess 모듈을 사용한다. subprocess 라는 모듈 설명을 먼저 해드리도록 할게요. subprocess는 python의 기본 모듈로써, 자체적으로 python 코드가 cmd 혹은 terminal에서 명령어를 입력하는 것과 동일한 효과를 볼 수 있도록 만들어진 모듈입니다. 다시 말씀 드리자면, python 코드로 terminal 명령어를 실행할 수 있습니다. 제가 추천해드리는 함수(와 코드)는 이렇습니다. import subprocess #꼭 해주셔야 합니다. subprocess.check_output(['명령어1', '명령어2', ... ], universal_newlines = True)[:-1] 명령어 부분은 꼭 띄어쓰기 단위로 그리고 리스트 클래스로 넣어 주셔야 합니다. 예를 들어 python3 multi.py single 1000000가 터미널에서 실행해야 하는 명령어라면, ['명령어1', '명령어2', ... ]은 다음과 같이 되어야 합니다. ['python3', 'mutli.py', 'single', '1000000'] 또 다른 함수는 subprocess.run을 쓸 수 있지만, python 코드가 끝나는 것과 동시에 이 파일 자체도 끝나버려, 활용하시기는 어려울 것 같습니다. 그리고 혹시나 task.join() 부분에서 python이 error를 뱉는다면, 무시하고 task.join() 부분을 주석처리해주시면 됩니다. 이 에러가 나는 이유는 join할 게 없기 때문입니다. 이렇게, 제가 보여드린 예시를 활용하시면, 원하시는 방향으로 코딩을 할 수 있으실 것 같습니다! 감사합니다~😊
멀티프로세싱 결과가 저장되지 않는 이유는 크게 2 가지를 들 수 있습니다. 1. list 자료 구조는 multiprocessing에 있어 매우 좋지 않은 구조입니다. 그리고 일반적인 list의 append는 CPU의 Activation된 모든 코어들이 list가 존재하는 메모리 상에 접근해야 합니다. 하지만, list라는 구조는 Class로 관리되기 때문에 메모리 접근 속도가 Array(파이썬에는 없어요)보다 훨씬 느립니다. 그렇기 때문에 메모리 상에 동시에 접근하게 되는 상황이 많이 발생하게 됩니다(접근 속도가 빠르다고 동시 접근 상황이 발생하지 않는 것은 아니나, 확률이 낮아집니다). 이때는 어떤 코어가 먼저 접근할지 정해줘야 합니다. 이런 기능을 Lock이라고 부릅니다. 그래서 다른 코어가 먼저 동일 메모리 주소에 접근중이었다면, Lock을 시켜 기다리도록 만들어주어야 합니다. 하지만, Python에는 Auto Lock 기능이 없어 수동 Lock을 통해 관리해주어야 합니다. 이 Lock을 통해 전체 결과를 저장하는 빈 공간에 넣어주는 코드를 짜야 합니다. 2. Cache 구조 때문에 발생할 수 있습니다. 일반적으로 CPU는 각 코어마다 자신만의 Cache를 지니고 있습니다. 일반적으로 Multi-Level Cache구조를 지니는데, L1 Cache는 독립적으로 존재하며 1번 코어의 L1 Cache에는 2, 3, 4 코어가 절대 접근할 수 없습니다. 그러나, L2 Cache도 L1 Cache처럼 독립적으로 존재하는 경우도 존재하나 일반적으로 1, 2, 3, 4 코어가 모두 접근할 수 있는 공유된 Cache입니다. 특별한 상황이 아니면, 아무리 Python으로 Multiprocessing을 한다고 하더라도 L1 Cache에 저장이 될 겁니다. 그러니 아무리 Multiprocessing을 한다고 하더라도 각자의 코어가 독립된 공간에서만 프로세싱을 진행하니 1번 코어의 결과만을 얻게 되는 것입니다 (쉽게 비유하자면, 저는 제 방에서 할 일을 하고, 부모님은 부모님 방에서 할 일을 하는 건데, 서로 각자의 방에 있으니 저나 부모님이나 서로 무슨 일을 하고 있는지 모르는 상황입니다. 그러나 같은 집에 살고는 있기 때문에 분명 공유되는 공간이 존재하는 상태입니다). 그렇기 때문에 강제로 공유된 L2 Cache를 쓰거나 메인 메모리의 Static 영역을 사용하게 해야 합니다. 이런 문제점을 해결하기 위해 Python에서는 Shared_Memory라는 방식의 결과 저장 방식을 채택하고 있습니다. 이건 표준 라이브러리이므로, 추가 설치 없이 바로 import가 가능합니다. 댓글로 다루기에는 전부 말씀드리기가 힘들고, 시간이 될 때에 Multiprocessing 2 영상을 다루도록 하겠습니다. 그리고 C/C++ 언어 다루기에 능숙하시다면, p-thread header file을 include해서 사용도 가능합니다. 또한, 제가 이 영상에서 다룬 Queue 구조도 사용이 가능하긴 합니다만, 웹 크롤링의 경우 일반적으로 많은 양의 데이터를 저장해야 하는 경우가 많기 때문에 Queue 구조를 활용하는 것은 좋은 선택이라고 보기 힘듭니다. 그래서, 직면하신 문제를 먼저 해결하고 싶으시다면, python shared_memory 또는 python lock, unlock이라는 키워드로 검색하셔서 공부하실 수 있을 것으로 보입니다! 문제를 제대로 해결해드리지 못해 송구스럽습니다 ㅠㅠ 제가 조금 더 자세히 다뤄드렸다면, 이런 일이 없었을텐데 죄송합니다 ㅠㅠ 혹시 또 다른 질문이 있으시다면 댓글이나 답글로 또 남겨주세요! 적극적으로 해결에 힘써드리겠습니다!
@sblee91810 ай бұрын
8개의 프로세서를 사용하면 적어도 4배는 빠른데...음.. 방법은 비슷해 보이는데..ㅋ
@MutexLock10 ай бұрын
안녕하세요! 사실 멀티 코어 프로세싱에서는 몇 개의 프로세서로는 무조건 몇 배는 빨라야 한다는 법칙같은 건 없습니다. 이론적으로는 몇 퍼센트의 코드 독립성에 따라 일반적으로 몇 배의 속도 증가한다는 내용이 있습니다. 하지만, 제가 영상에서 언급한 내용과 같이 n개의 프로세서를 활성시켰을 때 n배에 가까울 만큼 빠를 수도 속도 변화에 큰 차이가 없을 수도 오히려 더 느릴 수도 있습니다. 이러한 이유에는 독립성, 코드 작성시 사용한 문법, 캐시 메모리,CPU의 효율성등 영향 조건들이 너무나도 많습니다. 물론 영상에서 설명해놓은 방법보다도 더 효율적인 방식으로 코딩할 수 있으나 영상에서의 코드가 가장 직관적으로 보일 것 같아 이렇게 설명드렸습니다. Python에서는 Process뿐만 아니라 Thead, Semaphore 등의 모듈을 사용해서 더 효율적으로 코드를 작성할 수 있습니다. 어떤 이유에서 4배 정도 빨라졌는지 스스로 고민해보시면 컴퓨팅 사고에 더 도움이 되실 것 같습니다! 감사합니다!
@sblee91810 ай бұрын
@@MutexLock dataframe 연산처리를 하는데 컴 속도 한계 때문에 부득히 멀티를 사용하게 되었어요. 컴 자원을 특별히 효율적으로 하지는 않았고요 프로세서를 2~14개 까지 실험을 해보니 8개가 가장 효과적이더군요. 그다음 프로세서 증가에 대해선 효과가 적어요. 현재는 10개 프로세서 뛰어서 사용해요.
@MutexLock10 ай бұрын
@@sblee918그렇군요! Dataframe의 경우컴퓨터 분야에서 여러 의미의 dataframe 있습니다만, 추측컨대 thread 사용이 조금 더 효율적일 것으로 보입니다. 또한 CPU 스펙상의 실제 논리 프로세서가 8개인지 12개인지 16개인지, 그리고 CPU의 프로세서 구조가 big.LITTLE인지도 크게 작용했던 것으로 예상됩니다.
@user-fu2fm9tr6l3 жыл бұрын
도움좀 받을수 있을까요 ?
@MutexLock3 жыл бұрын
제가 경황이 없어서 이제 답해드리네요! 다른 댓글에서 답해드리겠습니다!
@Developer6532 жыл бұрын
어디서 주어들었대 ㅎㅎ
@MutexLock2 жыл бұрын
It’s 스킬
@user-yw6wf3uu1o3 жыл бұрын
코드 공유해주세ㅛ!
@MutexLock3 жыл бұрын
다음주에 시험이 끝나는데, 그 때 코드 업로드한 후에 그 사이트 알려드리도록 할게요!
@MutexLock3 жыл бұрын
영상 설명란에 코드 주소 추가해드렸습니다~ github.com/KJH-KZfaq/Python-Multiprocessing 영상 설명란과 동일한 주소입니다~ 기다려주셔서 너무 감사해요~