이번글은 모든 컴퓨터가 윈도우 환경이라는 가정하에 설명을 드릴거에요!


원격접속을 가능하게 하기 위해서는 한 가지 전제 조건이 있어요!


!!포트!!


포트라는건 앞선 "9.원격접속" 편에서 설명 드렸기 때문에 자세하게 설명하지 않을게요~


결과적으로 말하자면 외부에서 접속하기 위해서는 원격대상이 되는 컴퓨터가 위치해 있는 내부접속망에서 외부 포트를 열어주어야 해요! 



[Case1. 외부에서 내부 사설망에 원격접속 하는 경우]


1) 원격접속 대상이되는 컴퓨터에서 작업할 순서


1-1) 내부 사설망에서 열려있는 포트를 확인한다. --> 학교나 기업이라면 담당자에게 물어보면 이미 열려있는 포트를 알려주거나, 포트오픈 신청서 같은 양식을 작성하면 요청한 포트를 열어줄거에요.



1-2) 내부 사설망이 ipTIME과 같은 공유기로 연결이 되어 있다면 ipTIME에 접속해 포트포워드 설정을 해줘야 한다.


- 인터넷 브라우저에 192.168.0.1 를 입력하고 로그인하여 접속한다.



- 관리 도구를 클릭한다




- IP 주소 확인

윈도우키 --> cmd (명령어 프롬프트) --> ipconfig 명령어 입력 후 IP 주소 확인



- 고급설정 -> NAT/라우터 관리 -> 포트포워드 설정 -> 외부포트, 내부포트, IP주소 입력


이렇게 하면 외부에서 접속할 수 있도록 포트포워딩 완성




1-3) 내 PC -> 속성






1-4) 원격설정



1-5) '이 컴퓨터에 대한 원격 연결 허용' 클릭




1-6) 외부 IP 확인







2)외부에서 사용할 컴퓨터(내부 사설망으로 접속하기 위해 이용되는 컴퓨터) 작업 순서



2-1) "윈도우+r" --> mstsc 명령어 입력




2-2) '1-6)'에서 확인했던 외부IP와 승인된port 입력

ex) 외부IP주소:1.1.1.1/ 승인된port:20 --> 1.1.1.1:20 입력





2-3) 이 부분은 옵션이라 설정해주지 않으셔도 됩니다!


만약 듀얼 모니터를 쓰고 있다면 그냥 연결할 시, 한쪽 모니터에는 원격접속된 컴퓨터의 화면이 나오고 다른 한 쪽의 모니터에는 내가 현재 사용하고 있었던 컴퓨터의 화면이 나올거에요.


그런데 만약 듀얼 모니터 전부 원격접속된 컴퓨터의 화면을 보고 싶다면 '옵션표시'->'디스플레이'->모든 모니터를 원격 세션에 사용'클릭 해주시면 되요~







[Case2. 내부 사설망 내에서 원격접속 하는 경우]


만일 내부 사설망으로 연결된 컴퓨터끼리 원격접속을 하는 경우에는 '1-2)'에서 확인한 원격접속 대상이되는 내부 IP주소만 입력 하면 됩니다.



ex) ip주소= 1.1.1.1 --> 1.1.1.1 입력



더 많은 원격접속 방식이 있지만 가장 간단한 방식을 소개시켜드렸어요! 다음글에서는 우분투 환경에서 우분투 환경으로 원격접속 하는 방식에 대해서 설명해 드리도록 할게요!

안녕하세요~


이번글에서는 앞서 언급한 IP의 종류에 대해서 말씀드리도록 할게요!



앞서 IP가 물리적 위치의 고유 ID라고 했는데 ipTIME 공유기를 사용하시는 분들 보면 192.168.0.1, 192.168.0.2, 192.168.0.3, ... 이런 IP 주소들을 보신적이 있을거에요. 이상하게 경기도에서도 저런 IP를 쓰고, 부산에서도 똑같은 IP를 쓰고 ... 이게 어떻게 된것일까요?


지금부터 이러한 궁금증을 해결하기 위해 IP 종류에 대해서 알아보도록 할게요!





1. IP 종류


간단하게 IP 종류를 나눈다면 아래와 같이 나눌 수 있어요.




1) 공인IP VS 사설IP


1-1)공인IP


앞서 IP가 물리적 위치의 고유 ID 라고 말했던 의미는 공인IP를 의미한거에요. 

ICANN이라는 국제기구가 국가별로 사용할 IP 대역을 관리하고 우리나라에서는 KISA가 국내IP 대역을 관리하고 있어요. 



1-2)사설IP


점점 시대가 발전하면서 인터넷으로 서로 연결할수 있는 장치들이 증가하게 되었어요. 공인IP를 이용하면 금방 IP가 소진되기 때문에 사설IP라는 개념을 만들게 되었어요.


아래 그림을 보면 공인IP는 외부망들로 연결이 되어있는걸 알 수 있고, 사설IP는 내부망으로 연결되어 있다는걸 알고 있어요 (그래서 종종 외부IP를 공인IP라고 하는 경우도 있고, 사설IP를 내부IP라고 하는 경우도 있어요)

<그림1>



사설 IP를 사용하면 중복된 IP를 사용할 수 있어요. 먼저 사설IP 클래스를 살펴볼게요.


A클래스: 10.0.0.0 ~ 10.255.255.255

B클래스: 172.16.0.0 ~172.31.255.255

C클래스: 192.168.0.0~192.168.255.255


결론부터 이야기하면 하나의 공인IP당 위에 언급된 사설IP를 중복해서 사용할 수 있어요. NAT 기술을 이용하면 가능하다고 합니다만 여기서는 기술에 대한 언급은 하지 않을게요!


예를 들어, 제가 데이터 학과가 있다고 해볼게요. 이곳에는 201, 202, 203호 연구실이 있어요. 각 연구실에는 공인IP가 있어요. 제가 있는 연구실은 202호인데 이곳에 할당된 공인IP를 알아볼게요. 네이버에서 '내 아이피'라고 검색하면 쉽게 검색할 수 있어요. 일단 맨 뒷자리가 8이네요.




그리고 제 연구실(202호)의 공인IP에 ipTIME 공유기를 연결해서 사용하고 있어요. 저는 ipTIME에서 사설IP를 설정해 주었어요. 사설IP의 게이트웨이인 http://192.168.0.1/ IP주소를 웹 브라우저에 치면 아래와 같은 창이 뜰거에요. 이곳에서 제 연구실안에 있는 10대의 컴퓨터에 각각 사설IP를 할당해 줄거에요. 예를 들면, A 컴퓨터에는 192.168.0.2, 제 컴퓨터에는 192.169.0.3 이런식으로 말이죠.



 

CMD 프롬프트 창에서 ipconfig를 치면 사설IP주소가 검색돼요. 설정해준대로 192.168.0.3 사설IP가 검색되는걸 확인할 수 있어요!







2) 고정 ip VS 동적 ip


2-1) 고정 ip


우리가 일반적으로 인식하고 있는 ip는 고정ip 에요. 즉 해당 위치에 하나의 고유 ip 주소가 부여되고 시간에 따라 변경되지 않아요. 만약 네이버 서버의 ip가 시간에 따라 동적으로 바뀐다고 하면 어떻게 될까요? 바뀌는 순간에 무언가를 저장하거나 한다면 문제가 발생할 수 있어요. 그래서 이렇게 중요한 서버로 사용되는 IP는 고정ip로 사용한답니다.



2-2) 동적 ip


그런데 고정ip에는 한 가지 단점이 있어요. 예를 들어, 한 부서에 ip가 3개이고 고정ip로 사용하고 있다면, 컴퓨터 3대에 각각 고정ip를 할당하기 때문에 더 많은 컴퓨터를 사용할 수 없을거에요. 그런데 동적ip를 쓰면 3개의 공인ip를 8대의 컴퓨터가 동적으로 돌아가면서 쓸 수 있어요. 안쓰고 있는 컴퓨터에서는 ip할당이 안되고 인터넷을 쓰는 컴퓨터에 ip를 할당하는 식인거죠. 


정리하면, 서버와 같이 많은 사람들이 접속하고 중요한 작업물들을 네트워크 상에서 저장할때는 고정IP를 사용하고 각 가정에서 사용하는 공인IP는 동적(유동)ip로 부여하고, 공인ip를 이용해 사용하는 사설ip를 유동 또는 고정ip로 부여하게 돼요. 


보통 KT, SKT, LG U+ 같은 ISP업체들이 인터넷을 설치해주고 공인IP를 동적ip로 할당해주는데, 이때 동적ip로 할당해주려면 그때 그때 마다 할당시켜주어야 하니까 이러한 작업들을 운영 또는 관리를 해주는게 필요하겠죠? 이렇게 동적ip를 운영 또는 관리를 해주는 시스템을 DHCP (Dynamic Host Configuration Protoocol)이라고 해요. 그리고 DHCP 기능을 하는 서버를 DHCP 서버라고 합니다.



좀 더 자세한 설명은 아래 영상을 참고하세요~







3) 공유기


앞서 공인 ip를 동적ip로 할당해서 사용할 수 있다고 했는데, 사설IP도 마찬가지로 동적ip로 할당해 이용할 수 있어요. 동적 ip로 관리하기 위해서는 DHCP 서버가 필요하지만 이러한 기능이 탑재되어 있는 기기가 공유기입니다. 그래서 공유기에 공인IP가 할당된 인터넷 선을 연결하고, 공유기에 맞물린 컴퓨터들에는 사설ip를 부여해주어 사설 네트워크(망)를 만들어주게 됩니다. 


공유기에는 WAN, LAN이라는 글자가 있는지 WAN은 광역(Wide area) 네트워크를 의미하기 때문에 LAN선을 이용해 공인IP와 연결시키면 되고, LAN은 국지적(Local area) 네트워크를 의미하기 때문에 공유기에 연결할 컴퓨터들을 LAN선으로 연결시키면 됩니다.  


공유기 또한 외부IP와 연결되기 때문에 라우터 기능이 탑재되어 있고, 공유기 자체에도 IP를 할당해주어야 하는데 이때 할당되는 IP주소를 게이트웨이 주소라고 합니다. 앞서 설명한 게이트웨이 주소와 동일한데 공유기를 통해 외부IP와 내부IP를 연결시킬 수 있는 gate라는 의미로 이해하시면 될 것 같아요.


<그림2>




<그림3>


우리가 공유기와 컴퓨터를 연결시켜주면 자동으로 컴퓨터에 ip 주소가 부여되는데요. 이것이 공유기에 탑재된 DHCP 기능을 이용해 동적으로 ip가 할당 시켜준 것이라고 볼 수 있어요. 또한 새로운 컴퓨터를 두 대 설치하여 ip주소를 할당하려고 할때, 현재 1, 2, 5라는 ip가 사용되고 있다면 공유기(DHCP 서버)가 자신과 연결된 컴퓨터의 ip주소를 검색하고 빈자리에 해당하는 3, 4를 부여해주게 됩니다.

DHCP 서버에 따라 7일 또는 한달에 한 번 동적으로 ip 주소가 갱신됩니다. (종종 컴퓨터 LAN 선이 빠져있어서 다시 꽂으면 사설ip 주소가 바뀌는 경우가 있어요~)


하지만 공유기에서는 사설ip를 고정시켜 고정ip 운영방식으로 설정해줄 수 도 있어요. 만약 내가 원격접속해서 사용하려는 컴퓨터가 있는데 매번 동적으로 ip가 바뀐다면 접속이 끊기거나 재접속할수가 없겠죠?







2. 포트 포워딩


본래 포트라는 용어는 여러 곳에서 사용하고 있는 단어지만 보통 소프트웨어에서는 네트워크(IP) 상에서 프로세스를 식별하기 위해서 사용되는 개념이에요. 


포트에 대한 구체적인 개념은 하드웨어에서 사용할때랑 소프트웨어에서 사용할때랑 달라지긴 하지만,

이곳에서는 정말 단순하게 포트에 대해서 설명하도록 할거에요.


여기서부터 원격접속의 원리가 설명이 되니 집중해서 봐주세요~!


앞서 우리는 공인IP와 사설IP에 대해서 알아보았어요. 만약 우리집의 컴퓨터에서 내가 있는 회사의 컴퓨터에 접속하려면 아래와 같은 순서를 거치게 될거에요.


"우리집 사설 IP -> 우리집 공인 IP -> 회사 공인 IP -> 회사 사설 IP"


그런데 앞서 사설 IP는 중복이 가능하다고 했었죠? 그래서 우리집 사설 IP에서 회사 사설 IP로 바로 접속하지는 못하고 우리집 공인 IP와 회사 공인 IP를 거쳐야만 하는데, 만약 우리집에서 회사 사설IP로 원격접속을 하려고 한다면 어떻게 해야할까요? 회사 사설 IP로 바로 접속이 불가능하니 회사 공인 IP로 먼저 접속해야겠죠?


그런데 문제는 회사 사설 IP 주소를 모른다는 점이에요. 이러한 문제를 해결하기 위해 등장한것이 포트포워딩이라는 개념이에요!


공유기에서는 외부에서 A라는 포트가 들어올때, 사설 IP에 B라는 포트로 연결하도록 설정해 줄 수 있어요. 이런 과정이 포트를 전달(forwarding)하는것 처럼 보인다고 해서 포트 포워딩이라는 이름이 붙여졌어요. 


아래 그림을 참고해 볼게요. 공유기에 공인 IP로 들어오는 80번의 포트가 들어오면 사설 IP 192.168.0.2에 연결시켜주기 위해 192.168.0.2 IP주소에 80번 포트를 부여해줍니다. 이렇게 설정해주면, 우리집에서 회사의 컴퓨터1에 해당하는 사설IP에 원격접속할때, 12.34.56.78:80 이라고 입력해주면 먼저 회사 공인 IP역할을 하는 공유기에 접속하게되고, 회사 공유기에는 외부에서 80번 포트가 들어오면 192.168.0.2의 80번 포트로 연결하도록 설정되어 있으니 컴퓨터1로 접속하게 되는거에요. 


뭔가 말이 복잡해진거 같긴한데, 그냥 외부에서 사설IP를 접근할때 포트를 이용한다라고만 알고 계시면 될 것 같아요.


<그림3>



아래 그림에서는 외부에서 8080 포트를 이용해 접속할 때, 192.168.0.3 사설IP에 접속할 수 있도록 설정되었고, 8081 포트를 이용해 접속할 때는 192.168.0.4 사설 IP에 접속할 수 있도록 설정되었네요.

<그림4>



아래그림은 실제 ipTIME에서 포트포워딩 설정해주는 방식이에요 (자세한건 윈도우 원격접속 편을 참고해주세요~). "외부에서 공인IP:8081 방식으로 접속하면 내부 사설IP 192.168.0.4에 접근하도록 해주는데 이때 접근수단을 내부포트 80을 통해서 하도록 한다"라고 이해하면 될 것 같습니다~


<그림5>





 

이번장까지해서 원격접속에 대한 배경지식들을 알아보았어요. 그럼 다음장부터 본격적으로 원격접속 실습을 해보도록할게요!





[글 래퍼런스]

http://gotocloud.co.kr/?p=320

https://lamanus.kr/59

https://ydeer.tistory.com/18

https://run-it.tistory.com/19


[그림 래퍼런스]

그림1

https://gominless.tistory.com/entry/%EB%82%B4%EB%B6%80-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%82%AC%EC%84%A4-IP-%EC%99%B8%EB%B6%80-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%B5%EC%9D%B8-IP%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4

그림2

https://opentutorials.org/course/3265/20033

그림3

https://lamanus.kr/59

그림4,5

https://opentutorials.org/course/3265/20038


안녕하세요~


딥러닝을 사용하다보면 컴퓨터 한대로 작업하기 힘든 경우가 많이 있을거에요.

또한 이미지 또는 대용량의 데이터를 이용해 딥러닝 학습을 시키면 오랜 시간이 걸리기 때문에 업무가 끝나고 집에 도착해서 학습이 끝나는 경우가 많아요. 


이러한 문제 때문에 딥러닝 서버를 구성해 원격으로 학습을 시키고 테스트 하는데요.


이번 글에서는 원격 접속의 원리에 대해서 간단하게 알아보도록 할게요!




1. TCP/IP 4계층 (or OSI 7계층)


컴퓨터들이 서로 데이터를 주고 받기 위해 통신을 하는건 알고있죠? 

그런데 구체적으로 어떻게 주고 받는지 알고 계신가요?


세계 전문가들은 컴퓨터들이 데이터를 서로 주고 받을때 꼭 필요한 정보들을 정의 했어요. 


<그림1>


흔히 이것을 OSI 7계층 또는 TCP/IP 계층이라고 해요. 여기서는 자세한 설명은 하지 않고 간단하게만 언급하자면 OSI 7계층, TCP/IP 두 용어는 모두 컴퓨터간 통신을 위한 합의된 규약이라고 보시면 되요. 이전에는 OSI 7계층이 주로 사용되었는데, 좀 더 간소화시키기 위해 TCP/IP 규약이 나오게 되었답니다. 


<그림2>


예를 들어, A라는 컴퓨터에서 B라는 컴퓨터로 정보를 전달하려면 아래 그림처럼 통신규약에 따라 데이터를 생성, 송신, 수신하게 됩니다.


<그림3. 01001100011은 랜선과 같은 물리적인 전기 선을 의미>


좀 더 들여다보면 아래그림 처럼 각각의 계층이 필요로 하는 데이터들이 있어요. 아래그림을 보면 상위 레이어에서 점점 하위 레이어에 필요한 데이터 정보들이 추가 되는 것이 보이시죠? 쉽게 말하자면 TCP/UDP 레이어에서는 반드시 Upper layer의 정보가 필요하고, IP 레이어에서는 TCP/UDP, Upper 레이어의 정보들이 필요하다고 할 수 있겠어요.


<그림4>


원격접속을 위한 지식을 얻기 위해 어떤 계층을 눈여겨보면 될까요? 먼저 제일 필요하다고 생각되는 부분이 내 컴퓨터의 위치정보와 원격접속을 하기위한 컴퓨터의 위치정보일거에요.


이러한 위치정보를 생성해주는 곳이 IP 계층이랍니다. IP 레이어에서 요구되는 데이터 형식은 "IP header + 이전 상위 레이어의 정보"에요. 아래 그림에서 IP header를 보시면 source address, destination  address 부분이 있죠? 이것이 통신을 위한 컴퓨터들의 위치정보를 표현하는것이라고 보시면되요.


<그림5>


IP 계층이 원격접속을 하기 위해 필수적인 정보가 들어있다는걸 확인했으니, 좀 더 자세히 IP에 대해서 알아보도록 할게요.





2. IP (Internet Protocol)


인터넷은 말 그대로 'inter(상호간의)+net(망)' 즉, 서로를 (연결해주는 거대한) 망이라고 보시면 되요. 앞서도 언급했지만 이렇게 서로 연결해주기 위해서 제일 중요한건 컴퓨터들이 위치한 곳이 어디인지 알고 있어야 해요. 그리고 위치마다 고유 ID(식별자)가 있어야겠죠? 여기서 혼동해선 안되는 점이 컴퓨터의 고유 ID를 알아야 하는것이 아니라 컴퓨터가 위치한 '위치 ID'라는 거에요! 그리고 이러한 '위치 ID'를 오늘날 'IP주소'라고 부른답니다.


<그림6>



3) IP 주소


IP주소는 현재 IPv4, IPv6 형식으로 나뉘어 져있는데 이곳에서는 IPv4를 기준으로 설명드릴게요.


IPv4는 4개 영역으로 구분이 됩니다. 각 영역당 4bit씩 할당되어 있기 때문에 각 영역당 0~255(=2^4) 범위를 포함하고 있죠.


<그림7>


IP 주소는 크게 5가지 클래스로 나눌 수 있어요. 일반적으로 가정, 학교 같은 곳은 C클래스에 해당되요. 그래서 대부분 집이나 학교같은 곳에서 '윈도우키->cmd->ipconfig 명령어 입력'을 하면 192.~.~.~ 와 같은 주소가 출력될거에요. 하지만 네이버  같은 곳은 대형 통신망에 해당하기 때문에 A클래스에 해당되요. (인터넷 브라우저에 125.209.222.141 IP 주소를 입력하면 네이버 서버에 접속하게 될거에요!) 참고로 D,E 클래스는 미래에 사용하기 위해 남겨둔것이랍니다~


그림8,9를 보면 '호스트 수', '서브넷 마스크'라는 용어가 나와 있을거에요. 그럼 지금부터 차례대로 이해해 보도록 할게요.


<그림8>



<그림9>





4) Network ID, Host ID


위와 같이 네트워크를 클래스로 나눈 이유는 뭘까요? 예를들어 대형통신망과 가정에서쓰는 통신망을 관리하는 체계가 같다면 어떻게 될까요? 대형통신망에서는 좀 더 복잡한 관리 기법이 필요하지만 가정에서는 그 정도로 복잡한 관리 기법이 필요하지 않을거에요. 그래서 통신망이 복잡한 정도에 따라서 클래스를 나누고 그에 맞게 네트워크 관리를 해준다면 좀 더 효율적이겠죠?


위와 같은 관점에서 IP주소는 좀 더 세부적으로 Network ID, Host ID 부분으로 나뉜답니다. 그리고 '그림9'를 보시면 Network ID 부분이 네트워크 클래스를 결정짓는걸 볼 수 있어요. 클래스A는 Network ID가 127개에요. 그렇다면 Host ID는 무엇일까요? 


결론부터 말씀드리면, 대형통신망이 설치된 지역 한곳에 Network ID 하나가 할당되고, Network ID 하나당 2^24(Host ID -> 3개의 8bit 조합) 개의 Host ID가 부여되요. 예를 들어, 네이버에서 자신들이 이용하는 IP주소들이 있고, 구글 같은 곳에서 사용하는 IP 주소가 있을거에요. 관리차원에서 보면 네이버에서 사용되는 IP주소들과 구글이 사용하는 IP주소가 분류되면 더 효율적이겠죠? 이렇듯, 네이버라는 대형통신망 회사가 위치한 곳은 Network ID를 갖게되고, 네이버에서 따로 사용할 수 있는 IP주소들이 Host ID가 되는거에요. 당연히 통신망이 거대한 회사일수록 자신들이 갖아야 할 IP주소(Host ID)가 많아야겠죠?? 그래서 클래스마다 Host ID 개수가 차이가 나는거에요! 


<그림10>




5) 서브넷팅 (Subnetting)과 게이트웨이, 라우터


서브넷팅을 하는 이유는 크게 두 가지에요.


첫 번째는 IP주소의 낭비를 막기 위해서에요. 예를들어, A클래스에 해당하는 네이버가 사용할 수 있는 Host ID가 2^24개인데, 2^12개만 사용한다고 하면 나머지 절반에 해당하는 IP주소는 낭비가 되겠죠? 만약, 네이버 회사에 하나의 Network ID만 부여되었다고 했을때, 2^24 Host ID 중 2^12 Host ID만 사용한다면 남는 IP 주소들은 다른 곳에서 사용가능하겠죠?


두 번째는 데이터 전송의 효율을 높이기 위해서에요. 예를 들어, 네이버에서 할당 받은 Network ID 하나로 2^24개의 Host ID를 관리한다면 굉장히 복잡할 거에요. 네이버에서도 네트워크가 굉장히 중요한 부서가 있고 네트워크를 자주 활용하지 않은 부서들이 있을거에요. 또한 부서들끼리의 물리적 위치도 서로 다르겠죠. 이때 네이버의 Network ID의 Host ID 들을 부서에 따라 다르게 분류하여 관리해주면 네트워크 효율이 올라갈 거에요.



다시 윗 그림을 참고해서 설명해볼게요. 예를들어, 우리학교의 컴퓨터학부(C클래스)가 192.1.1.0이라는 Network ID를 할당받았다고 할게요. 그런데 컴퓨터학부에는 소프트웨어 학과, 데이터과학 학과, 임베디드 학과, 네트워크 학과로 나뉘어있어요. 그리고 컴퓨터학부는 C클래스이기 때문에 255개의 Host ID를 부여 받을 수 있어요. 효율적인 네트워크를 나누기 위해서 아래와 같이 IP주소를 공평하게 분할 할 수 있으며, 이렇게 분할하는 기법을 서브넷팅이라고 하고, 분할된 주소의 첫 번째 주소에 해당하는 (빨간색) 부분이 Network ID와 비슷한 역할을 하며 이를 서브 네트워크 주소라고 해요. Network Id가 Host Id를 관리하는 것처럼 서브넷팅으로 나뉜 Host Id들은 서브 네트워크 주소(ID)가 관라하게 됩니다. 여기서는 각각의 서브 네트워크 ID가 64개씩의 Host ID를 관리하겠네요! 


소프트웨어학과: 192.1.1.0~192.1.1.63

데이터과학학과: 192.1.1.64~192.1.1.127

임베디드 학과: 192.1.1.128~192.1.1.191

네트워크 학과: 192.1.1.192~192.1.1.255


참고로 이렇게 서브넷팅으로 나뉘어진 영역(학과)들끼리의 통신은 '라우터'를 통해서만 통신이 가능해요. 라우터는 다른 네트워크 영역들끼리 통신하기 위한 '장치(device)'이고, 다른 네트워크 영역들의 시작점이 되는 IP게이트웨이라고 합니다. 아래 4개의 학과에 빨간색으로 되어 있는 부분이 게이트웨이이고 라우터 장비를 통해 통신된다고 이해하면 되겠어요. 예를들어, 데이터과학과의 192.1.1.80에서 소프트웨어학과의 192.1.1.40 IP로 데이터를 전송하면 아래와 같은 순서로 전송되요.


192.1.1.80 -> 192.1.1.64 (데이터과학학과 게이트웨이) -> 라우터 -> 192.1.1.0 (소프트웨어학과 게이트웨이) -> 192.1.1.80


 



6) 서브넷마스크


서브넷마스크는 IP주소를 보고 Network ID를 알아내기 위해 도입된 개념이에요. 예를 들어, 클래스 A의 클래스가 125.209.222.141 이라고 했을때, 서브넷마스크가 255.0.0이라고 한다면 Network ID는 어떻게 될까요? 방법은 10진수를 2진수로 변경해 AND 연산을 하면 되요.


125.209.222.141 --> 1111101.11010001.11011110.10001101

255.0.0.0          --> 1111111.00000000.00000000.00000000

                  AND ============================

                           1111101.00000000.00000000.00000000 


125.209.222.141 의 Network ID는 125.0.0.0이라는걸 알게되었어요. 그렇다면 서브네팅된 IP들은 서브넷마스크가 어떻게 구성될까요? 위에서 언급한 예시를 통해 다시 설명해볼게요.


아래예시는 C클래스에 속해있다는걸 알 수 있어서요. 그래서 Network ID에 24bit가 할당되고, Host ID에 8bit가 할당되는걸 알 수 있죠. 하지만 서브넷팅 기술을 이용하여 4개의 sub network id를 만들어 주었어요. 이때 sub network id를 표현하기 위해서 Host ID 8bit에서 상위 2bit가 사용된것을 볼 수 있었어요.


소프트웨어학과: 192.1.1.0 --> 11000000.00000001.00000001.00000000

데이터과학학과: 192.1.1.64--> 11000000.00000001.00000001.01000000

임베디드 학과: 192.1.1.128--> 11000000.00000001.00000001.10000000

네트워크 학과: 192.1.1.61-->11000000.00000001.00000001.11000000


기본 C클래스 마스크에 sub network를 만들어주기 위해사용된 두 비트를 결합하면 각 sub network에 해당하는 서브넷 마스크가 만들어지게 됩니다. 여기 예시에서는 11111111.11111111.11111111.11000000 라고 정의할 수 있으며, 10진수 표현으로 255.255.255.192가 되는걸 확인 할 수 있어요. 서브넷팅과 서브넷 마스크를 위해 26개의 bit를 사용한걸 확인 할 수 있네요.


만약 C클래스에서 Host ID의 8bit 중에 상위 한 개의 비트만 서브넷팅으로 사용한다면 어떻게 될까요? 이와 같은 경우에는 서브넷팅을 위해 25bit가 사용되었기 때문에 서브넷 마스크는 255.255.255.128 이되고, Host IP의 범위는 [0~127], [128~255]가 됩니다.


제가 지금 컴퓨터학부(192.1.1.0)의 데이터과학학과의 IP인 192.1.1.80 IP를 사용하고 있다고 한다면, 26개의 bit를 서브넷 마스크로 이용하고 있는 것이기 때문에 아래와 같이 요약해서 표현할 수 있어요.

192.1.1.80/25 






3. DNS 서버


마지막으로는 상식 개념으로 DNS 서버에 대해서 알려드릴게요. CMD 창에 ipconfig /all 이라는 명령어를 입력하면 DNS 서버에 대한 정보도 ip주소로 출력이되는데, 이것이 의미하는바에 대해서 간단히 기술해 볼게요.


DNS는 Domain Name System이에요. 즉 우리가 보통 네이버를 들어갈때 네이버의 ip주소를 브라우저 창에 입력하는것이 아니고, www.naver.com 이라는 영문으로 입력해서 들어갑니다. IP 주소마다 고유의 이름을 domain name이라고 하고 이러한 domain name을 ip주소로 변환시켜주는 시스템을 domain name system이라고 불러요.


예를 들어, 아마존에서 제공하는 DNS(Domain Name System)에 대해서 알아보도록 할게요. 


<그림11>


[순서]

① domain name "www.example.com" 입력

② 케이블 인터넷 공급업체, DSL 광대역 공급업체 또는 ISP(인터넷 서비스 제공업체)가 관리하는 DNS 해석기로 라우팅 된다.


이 후 순서는 여기를 참고하시거나 아래 유튜브 영상을 참고하시면 될 것 같아요!





중요한건 DNS(Domain Name System)을 이용하기 위해서는 DNS 관련 서버가 필요한데, 예를들어 우리학교에서 DNS를 이용하려면 DNS 서버를 구비하고 있어야 해요. 그래서 보통 DNS 서버가 우리학교의 외부 IP와 유사한걸 확인할 수 있어요 (외부IP에 대해서는 다음글에서 확인해 드릴게요~ 여기서는 그냥 우리학교의 고유IP라고 생각하시면됩니다!)






지금까지 네트워크 기초 중에서 IP와 관련된 기본 개념들을 알아보았어요!


다음글에서는 IP 종류들을 설명해보도록 할게요!




[글 참조]

https://m.blog.naver.com/PostView.nhn?blogId=bloodsky12&logNo=60177159740&proxyReferer=https:%2F%2Fwww.google.com%2F

http://korean-daeddo.blogspot.com/2016/01/blog-post_26.html

https://aws.amazon.com/ko/route53/what-is-dns/


[그림 래퍼런스]

그림1

https://www.onlinewebfonts.com/icon/500770

그림2

https://mrnamu.blogspot.com/2019/11/2-tcpip-4.html

그림3

https://www.youtube.com/watch?v=7zeiHfRB8SM

그림4

https://m.blog.naver.com/PostView.nhn?blogId=kbm0996&logNo=221033960332&proxyReferer=https:%2F%2Fwww.google.com%2F

그림5

https://advancedinternettechnologies.wordpress.com/ipv4-header/

그림6

https://kr.123rf.com/photo_12041325_%EC%BB%B4%ED%93%A8%ED%84%B0-%ED%86%B5%EC%8B%A0-%EA%B0%9C%EB%85%90%EC%9E%85%EB%8B%88%EB%8B%A4-%EB%94%94%EC%A7%80%ED%84%B8-%EC%83%9D%EC%84%B1-%EB%90%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-.html

그림7

https://en.wikipedia.org/wiki/IPv4

그림8

https://www.youtube.com/watch?v=t_olN4OT9XY

그림9

https://engkimbs.tistory.com/622

그림10

http://korean-daeddo.blogspot.com/2015/12/ip.html

그림11

https://aws.amazon.com/ko/route53/what-is-dns/

안녕하세요~


앞선 글에서는 개념을 설명하려다 보니 굉장히 디테일하게 보여드렸는데요. 이번글에서는 vs code IDE로 빠르게 github에 파일을 업데이트 하는방법에 대해서 알려드릴게요!




Step1. 내가 업로드할 github repo 주소확인






Step2. 작업할 폴더 만들어주기







Step3. 해당 폴더에서 "git clone 업로드할git_repo주소" 입력






Step4. 내가 사용할 github repo에 있는 파일들이 다운로드 됨

(github과 동일한 환경을 구성하게 하기 위해, git clone을 한 것)






Step5. 해당 코드를 vs code IDE에서 열기






Step6. 코드 수정후 "ctrl+s"로 파일 저장하기 (*표시가 없어져야함)






Step7. 아래 git아이콘 클릭 -> refresh 버튼 클릭






Step8. add아이콘('+'모양) 클릭





Step9. commit아이콘(체크모양) 클릭하고



commit할 이름을 준다.






Step10. push하여 github에 코드를 업데이트






Step11. 업데이트 완성









간단하게 github에 코드를 업데이트하는 방식에 대해서 말씀드렸어요.


또 다른 방법은 아래 영상을 참고해주세요~








안녕하세요~


이번글에서는 지금까지 terminal에서 진행했던 작업을 GUI로 해볼 생각이에요.


우분투에서는 VS code IDE를 사용하여 버전관리를 하고, 윈도우환경에서는 sourcetree를 사용하여 버전관리하는 방법에 대해서 알아보려고해요. (sourcetree가 편하긴 한데, 우분투에서는 sourcetree를 이용할 수 없는거 같아요 ㅜ)








<1. 우분투에서 VS code IDE로 버전관리하기>


여기서는 A,B방법으로 알려드릴거에요~ 에러가 나시는 분은 두 방법 중 하나를 이용하시면 되요!

(개인적으로는 B 방법이 편하더라구요)


[A 방법]


1) VS code IDE의 파일을 github에 저장하기


step1. 새폴더(test_folder)에 새파일(test_git.py) 생성 후 실행시켜주기, 이 후 아래 빨간색부분 아이콘 클릭





steop2. 아래 빨간색 부분 '+' 클릭하고





현재 작업하고 있는 폴더 디렉토리를 설정해주면, 




해당 위치에 git repo (앞선글에서 "git init"과 같은 역할)를 생성하게 됨



동시에 CHANGES라는 곳에 test_git.py 이 위치하게 됨





Step3. test_git.py 파일에서 오른쪽 클릭하고 'Stage Changes'를 클릭하면




git add 명령어와 같은 역할을 하여 'test_git.py'파일을 staging 상태로 전환시켜준다.




그리고 현재 작업하고 있는 사람이 누구인지를 식별하기 위해 home 폴더에 .gitconfig 파일을 만들어주고, 아래와 같이 입력해준다 (빈칸은 'tab'키를 누른다). 이작업은 앞서 "git config ~" 명령어와 동일한 역할을 해준다. 





Step4. 해당 위치에 배포할 파일이름을 지정해준다. "git commit ~" 명령어와 동일한 역할을 한다.

아래와 같이 'git_commit2'를 입력하고 'ctrl+엔터'를 입력해준다



아래 빨간색 부분 이모티콘을 클릭하면, commit을 통해 index가 생성되었음을 확인할 수 있다.







Step5. test_git.py에 코드를 추가시켜준다.




다시 'test_git.py'을 클릭하면 수정된 부분을 확일할 수 있다.




앞서 진행했던 대로 반복해준다. commit 할때 파일이름은 git_commit2가 아닌 다른 이름으로해도 좋다 (원래 다른이름으로 해주는게 더 좋다. ex) git_commit3)







Step6. 'F1' 키를 누르고 'Git:ADD Remote'을 입력해준다. 이 작업은 원격저장소 github에 배포하기 전에 나의 github의 특정 repository에 접근하기 위한 작업을 해주기 위함이다.



"git remote add origin 원격저장소레파지토리" 작업을 하게 되는데 아래 순서대로 진행하면 된다.






내 github ID/PW 를 입력해준다







Step6. 해당 위치를 클릭하고 'Push'를 하면



(처음실행될때 아래 메시지가 뜨는데, ok를 클릭해주면 된다)



정상적으로 github에 등록됨을 알 수 있다.





2) VS code IDE에 있는 파일중에 몇몇 파일만 선택해서 github에 저장하기


우리가 작업을 하다보면 모든 파일들을 VS code IDE에 올리진 않을 거에요. 그래서 작업을 위해 필요한 몇몇 파일들만 github에 올리길 원하실거에요.


- test_git.py 파일 수정하고 실행시키기

- test_git2.py 파일 만들고 실행시키기

- venv 폴더 만들고 venv/test_git3.py 파일 생성 후 실행시키기 

- .gitignore 파일 만들고 저장하기



최종 결과 이미지를 보면 (위의 이미지), venv 폴더에 있는 파일들과, test_git2.py 파일은 add, commit 하지 않을거라고 선언되었기 때문에 모두 흰색으로 표시되어있어요. 그래서 push 를 이용하여 업로드하더라도 venv 폴더에 있는 파일들과, test_git2.py 파일은 github에 업로드 되지 않을거에요.







3)  Git Graph extension 해주기


VS code IDE에서는 Git Graph라는 plug-in을 제공해주고 있어요. 설치후 맨 아래부분(이미지 맨 아래 파란색언더바 부분)에서 Git Graph 부분을 클릭해주면




이곳에서도 'branch', 'commit history'를 볼 수 있게되요.












<2. 윈도우에서 Sourcetree를 이용해 버전관리하기>



작성중.....






안녕하세요~


지난글까지는 git을 이용하여 local repo에 파일을 업로드하는 내용을 다루었어요. 


<사진1>



이번글에서는 git을 이용하여 remote repo(원격저장소; Github)에 파일을 업로드 하는 방법에 대해 다루어보겠습니다.







<1. 원격저장소(remote repository)>


내 local 컴퓨터에서도 원격저장소를 만들어 저장시킬 수 있지만, 기본적으로는 다른 컴퓨터에 내 파일들을 저장시키는것이 '원격'이라는 의미를 잘 보여주기 때문에 다른 컴퓨터에 저장시키는 방식을 보여드리도록 할게요.


원격저장소에 내 코드파일들을 저장시키면 내 코드를 백업할수도 있고, 다른 사람들과 같이 협업할수도 있게 됩니다.


이곳에서는 Github이라는 원격 저장소에 local repo를 업로드 하는 방법에 대해서 알려드릴거에요



1) Github 만들기


먼저 ID를 만들어줍니다.






ID를 만들고 접속하면 아래 화면이 생성되는데요.


기본적으로 "89douner/89douner.github.io" 라는 repo가 생성되어 있네요.

저는 CNN 관련 코드를 업로드할 repo가 필요하기 때문에 'New' 버튼을 클릭해 새로운 CNN repo를 만들어줄거에요.






아래와 같이 자신의 목적에 맞게 기입합니다.

!!!!!!!!!!!!!주의해주세요!!!!!!!!!!!!!!!

저는 public으로 설정해주었는데요. 가끔씩 회사의 중요한 코드나 외부로 공개되어서는 안되는 project를 github에다가 올릴때 public repo에 올리면 법적인 문제가 생길 수 있어요 ㅜㅜㅜㅜ

그러니 이때는 회사에 요청해보고 승인을 해줄경우 private repo를 생성하여 버전관리를 하시면되요~







손쉽게 CNN repo가 생성된것이 보이시죠?












<2. Github에 업로드하기>


이제 내 local repo에 있는 코드를 github 원격 저장소에 업로드해볼게요. (아래 나온 설명대로 진행할 예정입니다)





Github에 코드를 올리기 위해 이전글에서 했던것처럼 code를 만들어주고, loca repo에 git 저장소를 생성("git init")해줍니다.






2개의 파일 (pytorch_cnn.py, README.md) 을 생성시켜주고 commit을 해줍니다.





"git remote add origin 원격저장소주소" 명령어를 입력해주면, 현재 내 local repo와 remote repo(Github)이 연결됩니다. (add origin의 의미는 "origin=원격저장소주소" 라는 별칭을 붙여주겠다는 뜻이에요. 그래서 push 명령어를 줄때, -u origin master 옵션을 추가해주면 앞으로 git push 명령어를 입력할때 origin(=특정 원격저장소주소)으로 master 브랜치의 파일들을 업로드 시켜주겠다는거에요





그리고, "git push -u origin 브랜치이름" 명령어를 입력하여 내 local repo의 파일을 github에 push해주면, 아래와 같이 인증절차를 거치게 됩니다. (Github ID/PW 입력)





인증절차를 마치면 아래와 같이 정상적으로 업도드 되었다는 메시지를 확인할 수 있어요.

참고로 




CNN repo에 다시 접속하면





아래와 같이 2개의 파일이 정상적으로 CNN repo에 업로드된걸 확인할 수 있어요!




python code를 확인해보니 문제없이 업로드 되었음을 확인할 수 있습니다.






<3. 여러 local repo와 동기화>


원격 저장소는 여러 로컬 저장소의 작업들을 동기화해서 백업과 동시에 협업을 할 수 있는 환경을 만들 수 있어요.


집과 사무실을 이동하며 개발하는 상황이라고 가정하고, 이전에 만든 원격 저장소를 복제하여 git_home, git_office라는 2개의 local repo (로컬 저장소)를 만들어 볼게요.



1) 집에서 github 코드를 다운받기


먼저 집에 도착해서 아래 명령어를 입력해 github코드를 다운받을거에요.



"git clone github주소 생성되는폴더이름" 





정확히 2개의 파일이 정상적으로 다운받아졌어요.






2) 회사에서도 github 코드 다운받기


사무실에서 github 코드를 다운받기





Github에서 다운 받은 파일을 보면 똑같은 파일이 다운로드 될거에요. 최초에 Github에 올렸을때 master 브랜치에서 origin 옵션준것을 기억하시나요?






clone을 통해 다운 받으면 ".git" 폴더에 그대로 origin 정보가 들어있는걸 확인할 수 있어요. 그래서 git clone을 통해 다운 받으면 나중에 push, pull 명령어로 업로드하고 다운로드할때 따로 원격저장소주소를 입력해주지 않아도 되요. (뒤에가서 좀 더 자세히 설명할게요!)








3) 집에서 코드 수정하고 github에 업로드하기


먼저 집에서 다운받은 python파일을 아래와같이 수정해줄거에요.





수정한 내용은 다시 commit 으로 집에 있는 loca repo에다가 업로드 시켜줄거에요.




git clone을 통해 다운받은 .git 폴더에 origin 정보가 들어있다고 했죠? 아래와 같이 "git remote -v"를 통해 확인해보면 origin 키워드가 어느 원격저장주소를 갖고있는 알 수 있어요.





따로 push 명령어를 입력할때 add 옵션을 주지않아도 origin에 할당된 원격주소에 local repo가 업로드되요.

 




집에서 작업한 파일이 정상적으로 github에 업로드된걸 확인할 수 있어요!









4) 변경된 code 확인하기


집에서 변경한 code를 업로드 했는데, 무엇이 변경되었는지 확인해볼까요?

먼저 아래 commits 탭 부분을 클릭해주시면 지금까지 commit 한 history가 나와요. (지금까지 작업했던 여러 버전들이 나오는거죠)





아래 집에서 commit했던 2 파일을 클릭하면

어떤 부분이 추가되었는지 확인할 수 있어요!

("No newline at end of file" 메시지는 치명적인 에러가 있는건 아니고, 보통 code를 작성할 때 마지막 코드줄은 아래빈칸을 만들어주는것이 관례라 이런 메시지가 나오고 있어요. 실행에 문제가 있는건 아니구요!)










5) 집에서 변경한 내용 사무실에 가져오기



이전에 회사에서도 git clone을 통해 github 코드를 다운받고, .git 폴더도 다운받았던것을 기억하시죠?


"git pull origin" 명령어를 입력해주면 아래와 같이 Github에 있는 집에서 변경했던 파일이 다운이되요. 





 이때 다운된 파일은 집에서 작업해서 바뀐 내용들이 들어 있는 파일만 다운됩니다 (덮어쓰기 생각하시면되요1). 만약 github에 있는 내용과 사무실에 있는 내용이 다르지 않다면 'already up to date(이미 최신상태이다)' 메시지가 뜰거에요 




다운받은 파일은 똑같이 작업하고 다시 github에다 업로드하면 "집<-->사무실" 이렇게 코드를 동기화시켜서 사용할 수 있게되요!








지금까지 github에 업로드하는 방식에 대해서 알아보았어요!


다음글에서는 간단하게 VS code IDE와 sourcetree를 이용하여 GUI형태로 github을 이용하는 방식에 대해서 알아보도록 할게요!




아래링크는 기본적인 git 명령어에 대해서 다룬글이니 사용시 참고해주세요~


https://medium.com/@pks2974/%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B8%B0%EC%B4%88-git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-533b3689db81


https://medium.com/@joongwon/git-git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC-c25b421ecdbd












[글 래퍼런스]

https://opentutorials.org/module/3733

https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

https://rogerdudler.github.io/git-guide/index.ko.html



[사진 래퍼런스]

사진1

https://dev.to/mollynem/git-github--workflow-fundamentals-5496




안녕하세요~

 

이번글에서는 '8-2. Git으로 버전관리하기'글을 기반으로 작성하는 곳이니 이번글이 이해가 안되시는 분은 먼저 읽어주시고 오시면 좋을거 같아요~

 

 

지난번글에서 'pytorch_cnn.py'를 기점으로 생성된 버전1,2,3,.... 을 생성하고 관리하는 방법을 알아보았어요.

 

 

 

 

그런데, 모두가 pytorch_cnn.py이라는 프로젝트 코드를 공유하고 개발하고 있는데 원래 계획과는 달리 자신이 다른 기능을 구현해보고 싶거나, 회사에서 다른 기능들을 구현해볼 수 없겠냐는 부탁이 들어온다면 어떻게 하시겠어요? 

 

먄약 'pytorch_cnn.py' 파일을 복사하고 개발하게되면 내가 수정하는 부분이외에는 기존 'pytorch_cnn.py'코드와 대부분 중복된 내용일 테니 불필요한 용량이 증가할거에요 (조금만 수정하기위해 엄청나게 많은 공간을 필요로 할 수 있어요ㅜ)... 내가 수정한 부분만 용량을 차지하면 참 좋을텐데요... 

 

또한 나중에 잘 만들어서 병합할때 다른 사람들에게 수정된 코드를 하나씩 다 설명해줄수도 없고....

 

이러한 문제들을 해결하기 위해 다음글에서는 git에서 제공하는 branch라는 기능에 대해서 알아보도록 할게요!

 

 

 

 

 

 

 

 

<1. Branch 생성하기>

 

git branch: 현재 어떤 branch가 있는지 확인합니다. 처음에는 기본 'master' branch가 있다는걸 확인 할 수 있어요.

git branch 이름: 이름이 아닌 다른 명칭을 사용해도 상관없지만, 저는 hyunsu라는 개발자가 따로 기능을 추가하기 위해 branch를 생성했다는 의미를 부여하고 싶어 아래와 같이 입력했어요.

git checkout 이름: '이름' branch로 이동하게 됩니다.

 

 

 

 

 

 

 

 

 

<2. 서로다른(독립적인) Branch에서 작업하기>

 

지금부터는 'master', 'hyunsu' 브랜치에서 각각 독립적으로 작업을 해볼게요.

 

 

 

1) hyunsu 브랜치에서 기능 추가하고 commit하기

 

 

 

 

 

2) master 브랜치로 이동 후, 기존 'pytorch_cnn.py'의 버그를 수정하기

 

 

 

 

 

 

git log --branches --graph --decorate --oneline 명령어를 입력하면 branch와 git으로 commit된 파일들의 history를 보여주게되요.

 

 

 

 

 

 

 

 

 

 

<3. Branch 병합하기>

 

앞서 'master', 'hyunsu' 브랜치에서 독립적으로 작업하던 내용을 병합해볼거에요.

 

여기에서는 branch가 2개 분이니, 'master' -> 'hyunsu' 또는 'hyunsu' -> 'master' 브랜치로 병합하는 경우의 수가 있겠죠? 

 

 

 

1) 'master' -> 'hyunsu' 병합

 

(먼저 'master' 브랜치에 위치해 있는지 확인해주세요)

 

먼저 현재 master 브랜치에 있는 파일을 확인해 볼게요.

 

아래와 같은 코드가 입력되어 있네요.

 

 

 

자그럼 hyunsu 브랜치에 있는 파일과 병합해볼게요.

"git merge hyunsu"

 

 

 

 

아래 창이 생성되면 'shift+세미콜론(;)'을 동시에 누르고 ':wq'를 입력해준 후 enter를 입력해주세요

 

 

 

"git log --branches --graph --decorate --oneline" 명령어를 이용하여 확인해보면, merge한 파일이 master 브랜치에 새롭게 생성된것을 볼 수 있어요.

 

 

 

 

hyunsu 브랜치 파일에 있는 내용과 비교해봤을 때, 하나의 코드가 추가된걸 확인할 수 있을거에요!

 

     

         

 

 

 

 

 

 

 

 

 

 

<4. Conflict(충돌) 문제 해결하기>

 

두 개의 파일을 merge(병합)할때 conflict 문제가 발생할 수 있어요. 어떤 경우에 conflict가 발생하는지 알아보도록 할게요.

 

먼저 conflict 예시를 들기위해 기존에 만들어놓은 .git 저장소를 제거해주고 

 

 

다시 생성해주었어요.

 

 

 

 

아래와 같은 코드를 만들어주고 master 1 파일을 만들어 줍니다. 

 

 

 

 

 

hyunsu 브랜치에서 2 파일을 만들어줍니다.

 

 

 

 

master 1->hyunsu 2 병합을 시켜주면 아무 문제가 일어나지 않아요.

 

 

 

 

 

 

 

 

그런데, master 1의 파일을 수정하여 master 3라는 파일을 commit했다고 합시다.

 

 

 

 

 

이때 master 3 -> hyunsu 2 를 병합하면 충돌(conflict)가 일어날 가능성이 생겨요.

 

 

 

문제가 일어나는 직접적인 원인은 master 3, hyunsu 2 코드에서 같은 줄에 위치한 내용이 다르기 때문인데요. master 1, hyunsu 2 코드에서도 같은 줄에 위치한 내용이 달랐지만 merge가 된것과 달리 master3, hyunsu 2 병합에서는 문제가 발생하네요. 

 

그 이유에 대해서 언급하자면 아래의 그림으로 표현할 수 있겠어요.

 

 

 

 

충돌문제가 발생하면 아래와 같이 master 브랜치의 어느 부분과 hyunsu 브랜치의 어느 부분이 conflict를 일으키는지 나오게 되는데요. 이 부분을 본인이 판단하는 것에 따라 수정을 해주시면 되요. 만약 

 

 

 

hyunsu 2 파일의 "B로 수정합니다" 부분을 삭제하고 "C로 수정합니다"로 대체하고 싶다면 아래와 같이 입력해주고, pytorch_cnn.py를 실행시킨후

 

 

 

 

commit 해주면 'master 3->hyunsu 2' 병합파일이 생성되요! (자동으로 병합이 생성되는이유는 conflict가 생성되면 자동으로 임시 브랜치인 'master|MERGING'이 생성되기 때문에, 이 branch는 현재 conflict 된 부분을 수정하는 중인걸 알려주고, commit을 통해 conflict가 해결이 되었다는 사실이 확인되면 자연스럽게 master 브랜치에서 'master 3 -> hyunsu 2' 병합파일인 master 4가 생성되는 원리에요.

 

 

 

 

 

 

 

 

 

<5. Branch 삭제하기>

 

삭제명령어: git branch -d 브랜치이름

 

 

 

 

 

 

 

 

 

지금까지 git을 이용하여 branch를 어떻게 하는지 알아보았어요.

 

다음 글에서는 지금까지 git을 이용하여 loca repo에 업로드한 파일들을 어떻게 원격저장소(remote repo; Github)에 업로드하고 사용할 수 있는지에 대해서 알아볼게요!   

 

 

 

 

[글 레퍼런스]

https://opentutorials.org/module/3733

https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

https://rogerdudler.github.io/git-guide/index.ko.html

 

 

안녕하세요~


이번시간에는 본격적으로 git을 이용하여 github에 코드들을 저장시키는 작업을 해보도록할거에요.



그럼 먼저 Git이라는 software program을 설치하고 이용하는 방법부터 알아보도록 할게요!





<1. Git 저장소 선언해주기>


1) Git 프로그램 설치하기


Git은 software program이에요. 그리고 git 프로그램에서 제공되는 명령어를 이용해 작업을 수행하게 되죠. 이러한 작업들을 하기 위해선 먼저 프로그램이 설치되어야겠죠? 아래링크를 접속하고 아래 네모박스부분에 download를 클릭하면 저절로 실행파일이 다운로드 됩니다 (페이지가 넘어가는데 실행파일 다운로드될때까지 그냥 기다리시면 되요~)


https://git-scm.com/



저는 그냥 기본 설정되어있는 상태로 전부 'Next'를 클릭했어요~




프로그램 설치된걸 확인하실 수 있어요~




Git bash를 클릭해주면, 아래 그림처럼 terminal을 이용하여 git을 사용할 수 있게되요! (나중에는 Git GUI로 더 쉽게 사용할 수 있어요! 여기서는 개념설명을 위해 git bash로 작업을 해볼게요!)







2) 프로젝트 폴더 만들어주기


Git을 이용하여 프로젝트를 관리하기 위해서는 프로젝트 폴더를 Git 저장소로 만들어야 해요.


저같은 경우에는 git 프로그램을 설치하니 숨은폴더에 git폴더가 있었어요.



이렇게되면 terminal (git bash)에서 작업을 할때 permission에러가 나는경우가 종종 생기기 때문에 바탕화면에 폴더(Tutorial 폴더)를 생성해주고 해당폴더(Git)를 붙여넣기해주었어요.








3) Git init


Tutorial 폴더에 접속하여 프로젝트 폴더 (pytorch_tutorial)을 만들고, git init 명령어를 입력하면, git (프로그램)에게 현재 프로젝트 폴더 (pytorch_tutorial)를 버전 관리 (git=VCS(Version Control System)하겠다고 선언하게 됩니다.




git init을 실행시켜주면 .git이라는 폴더가 생성되는데요. 





이 폴더(.git) 안에는 버전관리에 필요한 여러가지 파일들이 생성되게 됩니다.




결과적으로 프로젝트 폴더(pytorch_tutorial)가 새로운 git 저장소로 선언됐습니다!








<2. 버전 만들기>


이전에 배웠던 git의 workflow를 머리속에 그리면서 본격적으로 여러 버전을 만들고 어떻게 관리하는지 알아보도록 할게요.


<사진1>





1) 버전1(A) 만들기


먼저 버전A를 만들고 local repo에 업로드를 해볼게요.


아래 'pytorch_tutorial'을 git init으로 git repo라고 선언했기 때문에 이곳에 'pytorch_cnn.py'라는 기본 코드를 생성해줍니다.




'git status'라는 명령어를 입력하면 현재 상태를 확인할 수 있는데, commits 된것이 아무것도 없네요.


먼저 'pytorch_cnn.py'라는 버전A를 hyunsu라는 개발자가 작업했다는 인증을하기 위해서 아래와같은 명령어를 입력합니다.


'git config --global user.name 사용자이름'

'git config --global user.email 사용자이메일'





그리고 'add'명령어를 통해 'pytorch_cnn.py'파일을 staging 상태로 옮겨놓은 후, 'commit' 명령어를 통해 버전1d을 local repo에 올려줍니다.




'git log' 명령어를 통해 현재 '버전1'에 대한 정보가 출력되고 이를 통해 버전1이 local repo에 업로드 되었다는 사실을 알 수 있어요.





2) 버전2(B) 만들기


위와 같은 방식으로 버전2를 만들어줍니다. 버전2는 버전1에 기능(code 한줄)이 추가 된거라고 생각하시면 좋을것 같아요.




버전2(B)는 다른 사람이 작업했다는 인증을 남기기위해서 아래와 같이 설정하고 'add->commit' 해줍니다. 그 결과 'git log'명령어를 통해 버전2가 만들어 졌음을 알 수 있어요.




3) 버전3 만들기 (-am 옵션)


버전3(C)에 대한 코드를 아래와 같이 만들어 줍니다.




이번에는 버전2에 이어 버전3도 nicholao라는 개발자가 개발했다고 해볼게요. 그리고 버전3(C) 역시 commit하려고 하는데, add 명령어를 건너뛰고 곧바로 commit 시켜주고 싶다면 아래와 같이 '-am'옵션을 주면되요.



'git log'명령어를 통해 3개의 버전이 모두 local repo에 업로드 되었음을 알 수 있어요.







<3. 버전간의 변화 유무 확인하기>


버전 1, 2, 3 간에 변화를 알아보고 싶다면 '-p' 옵션을 주면 되요.


'git log -p' 명령어를 입력하면 아래와 같이 나오는데, 창을 좀더 키우거나


enter를 눌러주시면 계속해서 내용이 출력될거에요.






맨 아래 '1번'부터 순차적으로 설명해볼게요.

노란색: 버전1의 식별자

4f46baa: 버전1의 index


'2번'에서 알 수 있는 사실은 

46c113f: 버전2의 index

index 4f46baa..46c113f: 버전1과 버전2를 비교 -> 버전1을 기준으로 버전2에서 변경된 사항 출력


'3번'에서 알 수 있는 사실은

298a9a1: 버전3 index

index 46c113f..298a9a1: 버전2와 버전3을 비교 




위에서는 모두 현재버전과 현재버전을 기준으로 바로 직전의 버전만 비교후 출력해주었는데, 만일 자신이 버전1과 버전3을 비교하고 싶다면, 'git diff 버전1식별자..버전2식별자' 명령어를 입력해주면 됩니다.





<4. Local repo의 버전삭제 및 되돌리기>


만일 'commit'을 통해 버전1,2,3,4,5를 local repo에 업로드 시켰는데, 버전5,4를 삭제하고 다시 버전3 상태로 되돌리고 싶다면 'reset'명령어를 이용해주시면되요.


먼저 버전4를 만들어주고 commit합니다.






똑같이 버전5를 만들어추고 commit해 줍니다.



'git log' 명령어를 입력하시면 버전1,2,3,4,5 모두 local repo에 등록되어 있음을 알 수 있어요.



여기서 "git reset 돌아가고싶은버전의식별자 --hard" 를 입력해주시면 버전5,4가 삭제되는데... 잠깐!!!!!!!!!!!!!!!!!!!


!!!!!!!!!!!!!!!!!!여기서 잠깐 주의해주세요!!!!!!!!!!!!!!!!!!!!!!

reset 명령어를 통해 삭제하면 현재 내가 .git repo에서 작업하던 pytorch_cnn.py 코드도 변경되요!!! 그러니, 버전4,5를 삭제하기전 code를 따로 보관하고 싶다면 복사해서 다른곳에 저장시켜놔야해요 ㅜㅜ




reset 명령어를 통해 삭제된 결과를 아래와 같이 보실 수 있어요~












<5. .git 저장소 삭제하기>


마지막으로 .git 저장소 자체를 삭제하고 싶다면

.git 폴더가 있는 경로로 이동하여 'rm -r .git'을 입력해주세요. 특정메시지가 출력된다면 'y'를 계속 입력해수지면 됩니다! 









지금까지 'pytorch_cnn.py'를 기점으로 생성된 버전1,2,3,.... 을 생성하고 관리하는 방법을 알아보았어요.




그런데, 모두가 pytorch_cnn.py이라는 프로젝트 코드를 공유하고 개발하고 있는데 원래 계획과는 달리 자신이 다른 기능을 구현해보고 싶거나, 회사에서 다른 기능들을 구현해볼 수 없겠냐는 부탁이 들어온다면 어떻게 하시겠어요? 


먄약 'pytorch_cnn.py' 파일을 복사하고 개발하게되면 내가 수정하는 부분이외에는 기존 'pytorch_cnn.py'코드와 대부분 중복된 내용일 테니 불필요한 용량이 증가할거에요 (조금만 수정하기위해 엄청나게 많은 공간을 필요로 할 수 있어요ㅜ)... 내가 수정한 부분만 용량을 차지하면 참 좋을텐데요... 


또한 나중에 잘 만들어서 병합할때 다른 사람들에게 수정된 코드를 하나씩 다 설명해줄수도 없고....


이러한 문제들을 해결하기 위해 다음글에서는 git에서 제공하는 branch라는 기능에 대해서 알아보도록 할게요!











[글 레퍼런스]

https://opentutorials.org/module/3733

https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

https://rogerdudler.github.io/git-guide/index.ko.html



[사진 레퍼런스]

사진1

https://dev.to/mollynem/git-github--workflow-fundamentals-5496





안녕하세요~


이번 시간에는 Git, Github에 대해서 설명드릴까해요~


지난 Jupyter Notebook을 설명하면서 Github에 올려 공유를 할 수 있다고 잠깐 언급한적있었죠?


Github은 jupyter notebook의 내용을 공유할 수 있는 저장소뿐만 아니라 여러 장점을 갖고 있는 클라우드 원격저장소에요. 최근에는 많은 분들께서 자신만의 github을 만들어 포트폴리오를 만들기도 하고, 실제로도 고급 인력들을 채용할때는 논문외에 github이 얼마만큼 활성화되어 있는지도 본다고해요.


그럼 지금부터 git, github이 무엇인지, 왜 개발자들이 github를 이용하는건지에 대해서 다루어 보려고 해요. 




<1. 이전 프로젝트 개발방식의 문제점>


우리부서에서는 회의를 통해 프로그램을 4분기로 하여 만드는것으로 계획했어요.   


<사진1>


이 상황에서 발생할 수 있는 문제점이 뭐가 있을까요?


첫 번째, 과다한 용량을 차지한다

일반적으로 프로그램을 버전별로 개발하다보면 이전 버전들의 내용이 중복될 수 밖에 없어요. 예를들어, 버전2를 만들때는 버전1의 내용이 중복이 되어있겠죠? 그럼 버전별로 아래와 같은 중복된 code들이 만들어 질거에요.


버전1

버전2: 버전1+새로운 기능1

버전3: 버전2(=버전1+새로운 기능1)+새로운 기능2

버전4: 버전3(버전2(=버전1+새로운 기능1)+새로운 기능2)+새로운 기능3


기능을 구현하는데 요구되는 코드양이 적지가 않기 때문에 위와 같이 프로젝트 버전을 따로 관리한다면 굉장히 많은 용량이 필요하게 될거에요. (특히 딥러닝과 같이 'import' 해주어써 써줘야하는 패키지가 엄청 많은 경우라면 더 심하겠죠?)



두 번째, 공유파일을 다루는 경우 생기는 충돌 문제

나와 다른 팀원이 공유된 하나의 파일에 대해서 작업을 한다고 해볼게요. 우연히 동시에 공유된 파일에 접근하여 코드를 편집하기 시작했고, 내가 먼저 프로그램 코드를 편집하고 저장시킨다면 어떤 문제가 일어날까요? 다른 팀원이 작업하고 있는 코드에는 내가 변경했던 코드 내용이 없기 때문에 저장이 되지 않아 작업했던 내용을 날린다던지, 아니면 내가 편집했던 내용들을 덮어버려 내가 편집한 코드 내용을 날려버리던지 둘 중 한명의 노력은 물거품이 되고 말거에요.


<사진2>



세 번째, 책임소재 불분명 & 과거 작업내역 확인 어려움

여러명이 공유된 파일에 대해서 작업을 진행하다보면 누가 잘 못된 코드를 기입했는지, 언제부터 잘 못 된건지 파악하기 힘든경우가 많아요. 당장에는 에러가 나지 않았지만 거의 다 만들때 보니 어떤 특정부분에서 문제가 발생하는 경우가 생겨요. 이때 에러가 나는 코드 부분을 누가 만들었는지 알아야 해당 책임자에게 어떤 알고리즘을 사용했는지 물어보면서 빠르게 수정작업을 할 수 있을거에요. 또한 백업해둔것이 없으면 에러가 나기전으로 돌아가는것도 거의 불가능 할 거에요. 



이렇듯 과거에는 개발자들이 프로젝트를 진행할때 여러므로 어려운 문제가 많았답니다 ㅜㅜ






<2. Git>


<2-1. Git workflow>


위와 같은 문제를 해결해주기 위해 나온 시스템이 Git라는 시스템이에요. Git이란 소스코드의 버전들을 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템(VCS: Version Control System)'이라고 보시면되요. ('클라이언트-서버 버전 관리 시스템'도 있는데 대략적인 설명은 여기 링크를 참고해주세요!)


그렇다면 어떻게 관리를 해주는지 알아보도록 할까요?


<사진3>



1) Working directory


working directory는 현재 컴퓨터에서 작업 중인 작업 디렉토리를 말합니다.




2) Staging area


'add'명령어를 이용하면 working directory에서 작업한 내역들이 staging area로 옮겨집니다. staging area가 존재하는 이유는 프로젝트에 핵심적인 파일(staged 상태)만 관리하고 개발이나 테스트를 위해 임시로 필요한 파일들(moddified 상태)은 관리하지 않음을 명시하기 위해서에요. 



<사진4>



Git은 파일을 commited, Moddified, Staged 세 가지 상태로 관리하는데요.


Moddified ('add' 명령어 전): working directory에서 수정한 파일을 아직 local database에 commit하지 않은 것울 의미

Staged ('add' 명령어 후, 'commit' 명령어 전): 현재 수정한 파일을 곧 commit할 것이라고 표시한 상태

Commited ('commit' 명령어 후): 수정한 파일이 local database에 안전하게 저장됐다는 것을 의미




3) Local repo(sitory)


'commit' 명령어를 이용하면 staging area에 파일들을 최종적으로 local 컴퓨터에 저장하게되요.


그런데 프로그래밍을 하시다보면 다른 사람들의 코드 or 프로그램을 다운 받아서 쓰는 경우가 있는데 이럴때 마주하는 사이트가 github 사이트에요. Github이 뭐길래 다들 그곳에다 코드를 올리고 다운받는건지 지금부터 알아보도록 할게요!


'Commit' 후에는 최근 commit을 한 부분부터 과거에 commit한 이력까지 볼 수 있게 됩니다.


<사진5>


이렇게 commit한 시간대별로  버전A, 버전B, 버전C, 버전D가 저장되면 버전들별로 중복되는 부분을 제외하고 각 버전의 변경된 사항들만 기록하기 때문에 용량을 크게 차지하지도 않게 됩니다!



4) remote repo


remote repo는 뒷 부분에서 Github과 같이 설명하도록 할게요! 






<2-2. Branch>


프로그램을 개발하고 1/4분기에서 버전1을 출시했다고 가정해볼게요. 이미 1년짜리 프로젝트 계획을 모두 세워뒀기 때문에 계획에 따라 버전2를 만들려고해요.  



그런데 사용자들이 원래 계획했던것과는 다르게 다양한 요구들을 할 수 있어요. 또한 사용자들이 버전1을 사용하다가 버그를 발견하여 수정을 해달라고 요청할수도 있겠죠?


그렇다면 원래의 계획을 무시하고 버전 수정하고 기능도 추가하고 해야할까요? 그런데 이렇게 하면 원래 계획했던 아키텍처에 벗어나 나중에는 걷잡을 수 없는 문제가 나타날 수 있어요. 그래서 원래 계획하려고 했던 버전2를 만드는 작업을 하고, 계획에 없던 기능을 추가하려는 작업도 하고, 요청을 받은 버그수정하는 작업도 해야하는데, 이럴때마다 따로 코드를 저장하고 폴더를 구성해주면 굉장히 복잡하고 비효율적일 거에요.


보통 이러한 작업들(원래계획, 기능추가, 버그수정)은 버전1이라는 공유파일을 이용하여 각가 맡은 역할(원래계획, 기능추가, 버그수정)에 따라 별도로 진행되게 됩니다. 


Git은 공유파일을 각자 독립적인 작업 영역(저장소) 안에서 마음대로 소스코드를 변경할 수 있게 해주는 기능을 제공하는데, 이 기능을 'branch'라고 합니다. 이렇게 만들어지는 각각의 브랜치 (릴리스 branch, 기능추가 branch, 버그수정 branch)는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있어요.

<사진6>


Git은 기본적으로 중복되는 부분에 대해서는 모두 공유를 하는 상태이고, 자신들이 변경한 내용들만 따로 저장되는 방식이기 때문에 각각의 branch들끼리 병합(merge)함으로써 작업한 내용을 다시 새로운 하나의 branch로 만들 수 있게 되요!


<사진7>



1) Master branch


저장소를 처음 만들면, git은 'master'라는 이름의 만들어 줍니다. 다른 branch를 만들어주지 않는 이상 모든 작업은 'master'작업에서 이루어지게 됩니다.













<3. Github>


이전 'Git worlflow' 부분에서 'remote'에 대해 언급하지 않았었죠? 지금부터 이 부분에 대해서 언급을 해보려고 해요.


우리가 local에 우리가 작업했던 내용들을 'commit', 'branch' 등의 기능을 통해 관리한다는 사실은 이미 알고 있어요. 


Git은 버전관리를 위한 '소프트웨어'이고, git으로 저장된 내용들을 다른 서버로 저장시킬 수 있는데 이때 저장되는 장소를 Github이라고 해요. Git에서 클라우드 형태로 파일 저장소를 무료로 제공해주는거죠. 앞서 Docker에서도 도커 이미지를 Docker hub에 배포하면 여러사람들이 접근해서 다운 받아 쓸 수 있다고 했었죠? Github도 마찬가지에요!


이때 local repo에서 'push'라는 명령어를 입력하면 local 작업물들이 github에 저장되게 되는거죠. Github을 사용하게 되면 git의 장점을 그대로 갖고있는것과 별개로 추가적인 장점들이 있어요.





1) 코드를 원격으로 백업

 

Github은 내 코드들을 원격으로 백업하는 용도로 사용할 수 있어요. Git의 장점이 그대로 적용된다는 사실을 아신다면 그냥 하드에다가 코드를 버전별로 저장해서 관리하는것 보다 훨씬 효율적인 백업이 되겠죠?






2) 다른 사람들의 코드를 open source로 공유하여 쓸 수 있어요.


저같은 경우에도 프로젝트를 위해 옥스퍼드에서 matlab으로 구현한 딥러닝 tool을 사용할때가 있었는데, 에러나 모르는 부분이 생길때마다 관련 개발자에게 메일을 남기거나 github에 있는 Q&A 부분에 관련 질문들을 올려서 빠르게 답변을 받고 서로 관련 코드를 수정했던 기억이 있어요.






3) 포트폴리오의 역할도 할 수 있어요.


전문인력을 뽑을때 방법은 다양해요. 아는 지인을 통해서 소개를 받거나, 면접을 통해 프로젝트 내용들을 들어보는거죠. 그런데 내 눈으로 코딩을 짜는 모습을 본것이 아니기 때문에 인력을 뽑아도 되나 망설이실거에요. 그리고 만들었던 프로젝트들의 성능도 실제로 뛰어난건지도 모르는 일이구요.


그래서 github을 이용하면 자신을 좀 더 신뢰감있게 표현할 수 있게되요. 즉, 자신이 github을 만들고 운영하면 실제로 이 사람이 프로젝트한 코드 내용들이나 관련 설명들을 전부 볼 수 있기 때문에 신뢰감이 더 높아지는거죠. 만약 스타(facebook에 좋아요와 같은 기능) or folk (다른 사람들이 자신의 github 코드를 가져다 쓴 횟수)의 수가 많아지면 여러곳에서 작업을 같이 하자고 연락이 올 수도 있을거에요.


<사진8>


하지만 자신이 작성한 코드가 이상하다면 오히려 안좋게 사용될 수 있겠죠? 면접관들이 github 코드를 보고 '별로 code를 잘 못짜는거 같네...'하고 면접도 보기전에 서류 탈락할 수도 있을테니까요ㅜㅜ 







4) 코드 블로그 만들기 (with jupyter notebook 연동)


제가 운영하고 있는 이 블로그에는 한 가지 문제점이 있어요.


예를들어 VGG 이론을 설명하는 내용들은 충분히 블로그에서 글로 작성할 수 있는데, 코딩에 대한 설명을 하려고 하면 아래와 같이되요.



"두개 이상의 확률 변수가 서로 관계를 가지며 존재하는 경우를 생각해보자, 예를 들어 학교에 있는 학생의 키와 몸무게를 측정하는 경우, 한명의 학생 w에 대해 두개의 자료 (x,y)가 한 쌍으로 나오게 된다. 이렇게 취득한 자료를 확률변수 X와 Y로 볼때, 이를 묘사하기 위한 확률 분포를 결합확률분포(Joint Probability Distribution)이라고 한다."


import scipy.stats as st

import numpy as np


mu=[0,0]

.

.


뭔가 조금 읽기에도 불편하고, 코드가 한 두 줄도 아니라 ....


그래서 일반적으로는 code에 대한 설명을 할때에는 주석을 붙이긴 하지만 앞서 설명드린 jupyter notebook을 통해서 code를 보기 좋게 설명할 수 있다고 말씀드린바있죠? Github은 jupyter notebook과 연동이 가능하기 때문에 jupyter notebook에서 code를 설명해주는 글을 작성하고 github에 올릴 수 있어요. 즉, "github=code 블로그"가 되는거죠!


<사진9>








지금까지 Git과 Github이 무엇이고, 왜 쓰는것이 좋은건지를 말씀드렸어요.


다음글에서는 실제로 git과 github을 어떻게 사용하는지에 대한 글을 올리도록 할게요!











[글 레퍼런스]

https://backlog.com/git-tutorial/kr/intro/intro1_1.html

https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

https://www.opentutorials.org/module/3963/24425

https://opentutorials.org/module/3733

https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

https://rogerdudler.github.io/git-guide/index.ko.html

https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88


[사진 레퍼런스]

사진1

https://en.wikipedia.org/wiki/File:Application-default-icon.svg

사진2

https://backlog.com/git-tutorial/kr/intro/intro1_1.html

사진3

https://www.opentutorials.org/module/3963/24425

사진4

https://backlog.com/git-tutorial/kr/intro/intro1_4.html

사진5

https://backlog.com/git-tutorial/kr/intro/intro1_3.html

사진6

https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

사진7

https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

사진8

https://github.com/tensorflow/models/tree/master/research/object_detection

사진9

https://github.com/youngji-cho/ipython-notebook/blob/master/2017-04-03-%EB%B2%A1%ED%84%B0%EC%99%80%20%ED%96%89%EB%A0%AC.ipynb

안녕하세요 이번글에서는 구글 Colab에 대해서 말씀드리려고해요~


앞서 도커를 살펴보셨을때 어떠셨나요? 혹시 이런 생각을 해보시진 않았나요?


"뭐... 다 좋은데.. 편하게 하려고 도커쓰는건데 배우는데 시간 투자하느라 더 힘들겠어... 

내가 하루종일 할 것도 아니고 튜토리얼로 좀 해보려고하는데 엄청 힘드네...


추가적으로 윈도우에서는 컨테이너에 GPU도 못올리게 되어있으니... 리눅스를 쓰라는건지... 등등 여러므로 불편하셨을거에요!


그래서 이번글에서는 딥러닝을 접하시는 입문자분들이 사용할 딥러닝 개발환경 서비스에 대해서 알아보도록 할거에요.




<1. Colab이 뭔가요?>


Colab이란 Google에서 만든 클라우드 서비스에요. 


(클라우드에 대한 설명, 1:38초부터 보셔도 무방합니다)

 

Colab에서는 GPU, TPU 등을 VM (Virtual Machine; 가상머신)으로 제공하고 있어요. 


Colab은 여러용도로 사용하고 있지만 일반적으로는 Data Science, Machine Learning, Deep Learning을 사용하기 위한 서버(GPU, CPU, RAM 등)와 패키지(Python, Pytorch, Tensorflow 등등)들이 가상환경에 설치되어 있어요. 



<사진1>


<사진2. Colab에서 제공하는 컴퓨터 사양>



그래서 우리가 Colab을 이용하게 되면 딥러닝을 하기위해 구글에서 설치해놓은 여러 장비들과 패키지들을 이용하기 때문에 코딩하는것만 신경쓰면 됩니다 ㅎㅎ  


그럼 예제를 통해 코드를 한 번 작성해볼까요?


Step1. Colab 사이트 접속후 노트만들기


https://colab.research.google.com/notebooks/intro.ipynb



Step2. Code 입력



Step3. 실행하기


'런타임'메뉴에서 모두 실행하기를 선택해주셔도 되고



아래와 같이 현재 작성한 코드 부분만 실행하고 싶다면 해당 부분에 버튼 부분을 클릭하시거나, ctrl+enter를 클릭하시면 됩니다.










<2. Colab으로 Tensorflow, Pytorch 실행하기>




1) Tensorflow with GPU


이번에는 Colab에서 Tensorflow 패키지가 설치되어 있는지, GPU 버전으로 tensorflow가 실행되고 있는지 확인해볼게요.


Step1. '런타임 메뉴' -> '런타임 유형 변경'




Step2. '하드웨어 가속기' -> GPU 클릭




Step3. 아래 코드 입력후 실행 ("ctrl+enter" or "버튼 아이콘 클릭")


현재 Colab은 tensorflow 1.5를 지원하고 있는데 1.5버전은 조금 오래됐기도 하고, 최근에는 2.0 버전들을 사용하는 경우가 많기 때문에 위와 같이 2.x 버전을 사용해주는것이 좋아요. 그리고 곧 tensorflow 2.x로 기본설정을 변경한다고 하네요.


Tensorflow 2.x 버전을 사용하기 위해서는 2.x 버전의 패키지를 설치해야하지만 아래 코드를 사용하면 굳이 2.x 버전을 설치하지 않고 바로 사용할 수 있다고 하네요.


%tensorflow_version 2.x



제공되는 tensorflow version은 2.x 버전이고, 0번 GPU를 사용하고 있음 (보통 하나의 컴퓨터에 GPU 번호는 0번부터 시작합니다.)




2) Pytorch with GPU


기본적인 설정은 위와 같고 코드로 확인만 해주시면 되요.

to 함수를 통해 tensor가 GPU로 계산되는 것을 확인할 수 있을거에요.









<3. 패키지 설치하기>


Colab에 기본적인 패키지가 설치되어 있다고 하더라도, 우리가 직접 설치를 해주어야 하는 경우도 발생할 거에요.


먼저 mpl_finance라는 패키지를 사용하려고 해볼게요. 하지만 아래와 같이 코드 입력시 mpl_finance라는 패키지는 설치가 되어있지 않다고 나와있어요.



그래서 아래와 같은 명령어를 입력해주고 실행시키면 mpl_finance가 설치되고, import mpl_finance 코드를 다시 실행시키면 에러코드없이 mpl_finance 패키지를 읽어드리는걸 확인하실 수 있어요.








<4. 내 로컬 데이터 Colab 서버에 업로드하여 사용하기>


내 로컬 데이터를 사용하기 위해서는 우선 Colab 서버에 내 데이터를 올려서 사용해야해요. (

(코드는 아래 사이트를 참고해주세요)


https://colab.research.google.com/github/nicewook/datascience_exercise/blob/master/upload_file_and_display_image.ipynb#scrollTo=v0YgONGKaiv5



그런데 이런 방식으로 사용할 경우 문제가 있어요. 뒷 부분에서 설명하겠지만 Colab은 12시간만 session유지가 가능해요. 쉽게 말해서 12시간이 지나면 서버에 올려놓았던 내 데이터들이 전부사라지게되요. 사실 우리가 작업을 하면 같은 데이터를 계속 사용하는 경우가 많죠? 그런데 매일 이렇게 업로드 해주면서까지 사용할 필요가 있을까요??







<5. Google Drive와 연동해서 Colab 사용하기>


Colab이 Google에서 만들었기 때문에 내가 사용하려고 하는 데이터를 Google Drive에 올려놓고 사용할 수 있도록 해놓았어요. 이렇게 하면 Colab에 굳이 내 데이터를 업로드해서 사용하지 않으셔도되요!



Step1. Google 인증코드 생성 




Step2. URL 클릭




Step3. 계정 클릭


Step4. 생성된 코드 복사


Step5. 코드 붙여넣기한 후 Enter -> 인증확인




Step6. Google Drive에 Colab Notebooks 폴더 생성됨 -> 클릭



Step7. 해당 폴더에 내 로컬 이미지 파일 업로드





Step8. 이미지 출력하기


아래코드를 입력하면 image 출력가능


A. IPython 패키지를 이용해 출력




B. matplotlib 패키지로 이미지 출력하기





이렇게 Google Drive와 연동해서 사용하는 방식에도 문제는 있어요. 일반적으로 Vision 분야에서는 보통 이미지 데이터나 동영상 데이터를 사용하기 때문에 용량이 엄청나요. 그런데 Google Drive는 무료로 사용할 수 있는 용량이 제한적이기 때문에 돈을 지불하고 Google Drive 용량을 늘려가면서 작업을 해야할거에요.








<6. CNN를 이용한 Fashion MNIST 데이터 학습시키기>


CNN은 주로 이미지 영역에서 사용되는 딥러닝 모델인데요. Colab에서 의류(fashion)와 관련된 데이터들을 load하여 CNN을 학습시키고, 최종 의류데이터들을 분류(classification)하는 작업을 간단히 해볼거에요.

(코드는 아래 사이트를 참고해주세요)


https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/fashion_mnist.ipynb


Step1. Fashion MNIST data load하기


tensorflow.keras 패키지에 Fashion MNIST data가 들어 있습니다. 아래코드를 입력해주시면 데이터가 load되요.




Step2. 간단한 CNN 모델 만들기


이곳에서 기본적인 Convolution Neural Network 모델을 구현해줍니다. (Dense=FC layer)



Step3. CNN 모델 학습시키기


epoch=17로 설정했기 때문에, 17번의 epoch동안 학습을 진행하게 되요.




Step4. Test 하기


아래와 같은 코드를 구현해주고 실행시켜주면



각 이미지를 classification해주는것을 볼 수 있어요.






<7. 다시 접속>


Colab을 종료시키고 다시 접속할때 본인이 작성한코드가 google drive에 있으니 google drive로 가서 실행시켜주면됩니다!






<8. 단점>


이렇게 간단하고 좋은 서비스를 이용하지 않는 이유는 무엇일까요?


첫 번째로는 session 문제에요. 이전에 잠깐 12시간의 session만 유지된다고 말씀드린바있죠? 


(쿠키, 세션, 캐시에 대한 설명)



Colab은 Docker로 동작하기 때문에 session이 종료된다는건 컨테이너가 종료된다는거에요. 그렇다면 그동안에 했던 작업에서 생성된 데이터들이 다 날라가죠 (아! 물론 코드같은 경우는 Google drive에 저장됩니다~). 


또한 내가 학습시킬 용량이 크다고하면 종종 컴퓨터를 12시간 이상 학습시키는 경우도 있을텐데, Colab을 쓴다면 학습이 중간에 중단될거에요. 물론 10시간씩 학습시키고 학습시킨 모델을 따로 보관하고 다시 해당 모델을 불러와 10시간씩 학습하는 방법이 있지만 글쎄요... 자기도 모르게 12시간 넘겨버리면 위험해지지 않을까요? (아, 그리고 12시간이라고는 하는데 중간에 session이 끊길수도 있고 아무것도 안하고 있으면 session이 일정시간후에 자동 종료된다고 하네요 ㄷㄷㄷ;; 그래서 가끔씩 background로 딥러닝 모델을 학습시키고 어디갔다오면 갑자기 학습이 종료되있는 현상도....)


<사진3>


두 번째 단점은 속도에요.


자신이 로컬에서 설치하고 실행했던 작업을 Colab을 실행시킨분들이 있으시다면 굉장히 느려졌다고 느끼셨을거에요. Colab은 다수의 사용자들이 물리적 서버에 접속하여 한정된 자원을 나눠쓰는 구조인데요. 만약 갑자기 사용자들이 많아진다거나 다수의 사용자들을 엄청난 물리적자원(GPU, CPU 등)을 요구하는 작업을 한다고 했을때 Colab은 더욱느려질거에요 (우리나라 사람들만 사용하는건 아니니까요;;;). 즉, 사람들이 많이 몰렸을때 GPU가 포화상태면 내가 조금 기다려야 할수있는 극단적인 상황이 만들어질 가능성도 있어요 (뭐 그런 경우는 극히 드물긴하겠지만 조금 느려진거 같다는 느낌은 가끔 경험할 수 있을거에요).






현재 Google은 위와 같은 단점을 극복하고자 Colab Pro라는 서비스를 유료로 제공하고 있어요.

https://colab.research.google.com/signup#


아직 Colab Pro를 써보진 않았지만 아직까지는 미국에서만 사용가능 하다고하네요. (Colab Pro가 아직까지는 많은 사람들이 쓰는것 같진 않아서 좀 지켜봐야할 것 같아요) 



어쨌든 튜토리얼로 부담없이 사용해보고 싶다고 하시는 분들에게는 좋은 선택이겠지만 자신이 안전하게 작업을 하고 싶다면 Google Cloud Platform (GCP)을 사용하시는걸 추천드려요. 



Jupyter notebook을 설명하면서 Github에 대해 설명드린다고 했었죠? 그렇기 때문에 GCP에 대한 글을 쓰기 이전에 다음글에서는 Github에 대해서 다루어보려고해요! 그럼 다음글에서 뵐께요~



[사진 래퍼런스]

사진1

https://colab.research.google.com/notebooks/intro.ipynb#scrollTo=2fhs6GZ4qFMx

사진2

https://colab.research.google.com/drive/151805XTDg--dgHb3-AXJCpnWaqRhop_2#scrollTo=vEWe-FHNDY3E

사진3

https://jybaek.tistory.com/686


+ Recent posts