말레이시아 회사생활 정리

회사에서 알려주는 자잘한 퇴사 체크리스트를 제외하고 크게 다음의 세가지가 완료되어야 한다.
1. 세금정산(tax clearance)
2. EP 취소
3. EPF 출금

2021년 10월 현재는 COVID-19의 여파로 공공기관들이 제한된 slot만을 운영하고 처리에 시간이 오래 걸린다는 점을 감안해서 될 수 있는 한 빨리 시작하는게 좋다. 이 외에도 인터넷과 후불 핸드폰 요금제를 위한 deposit, 로드텍스와 자동차 보험료 환급 등을 돌려 받는데 많게는 두세달 까지 시간이 소요되므로 은행 계좌는 당분간 계속 열어두는게 좋다.

사전 준비

회사에 이야기해서 터미네이션 날짜와 출국 날짜를 정하면 우선 비행편 부터 끊자, 여러 기관에서 출국일자에 대한 근거서류로 사용될 수 있다. 그리고 하드카피로 제출해야하는 문서들이 꽤나 있으니 프린트와 스캔을 할 수 있는 환경이 되는 것이 좋다.

• 출국 비행편
• 인터넷 등의 서비스 종료일자 지정
• 은행계좌 유지

Tax Clearance

회사에 CP21 문서를 요청하고 PCBII와 지난 3년간의 EA form 그리고 세금 면제를 위한 영수증들을 준비해 둔다. HASIL homepage에 가면 BE form을 찾을 수 있는데, 가장 최근 해의 양식을 다운로드 받아서 수기로 선을 긋고 해당 년도로 수정한 다음 내용을 작성한다. 준비된 서류는 가까운 LHDN branch를 방문해서 제출해야 하는데, 상황이 상황인지라 온라인 제출도 받고 있다. e-SPC를 통해 제출해야 하는 줄 알았는데, HR을 통해 LHDN에 물어봤더니 그냥 소프트카피들을 메일로 보내고 하드카피를 별도로 LHDN office로 보내면 방문할 필요 없이 접수를 해준다고 한다.

BE form의 영문버전은 참조용이며 반드시 말레이어버전을 작성해서 제출해야 함에 유의 해야한다.

안내에 따라 소프트카피들을 10MB이내로 압축해서 보내고 DHL로 하드카피를 사무실로 보냈다. 우편접수는 12시까지만 받는다고 해서 DHL에 시간을 지정해서 배달해달라고 했는데, 당연하게도 잘 받았다는 응답같은건 보내주지 않는다. DHL에서트래커를 보고 있다가 도착확인해달라고 메일을 보냈는데 이 또한 당연하게도 응답이 없다.

14 working day가 소요된다고 하는데, 주말과 공휴일을 빼면 대략 한달 정도된다. Tax agent에 물어보니 tax clearance가 완료되지 않은 상황에서도 출국은 가능하다고 한다. IRB의 블랙리스트에 오른 상태가 하니라면.

제출 서류
• CP21
• BE form(malay version)
• PCBII
• 3년치 EA form
• Traveling schedule
• 여권 scan
• 세금면제 영수증들

EP cancelation

이 건은 직접하지 않고 회사와 계약된 agent가 처리해 주었는데 이민국이 제한된 slot만을 운영하고 있어서 곧바로 처리되지 못할 수도 있다. 출국 비행기표와 여권을 보내 주었는데 대략 이틀 정도 지나서 완료 되었다는 연락을 받았다.

돌려받은 여권에는 EP page에 수기로 expiary date이 출국날짜로 수정되어 있고, 출국일정에 대한 메모가 남겨져 있다.

EPF 출금신청

회사로 부터 EPF 기여내역과 퇴사 레터를 받으면 진행 할 수 있다. 또한 실물 여권이 없으면 부가 서류가 필요하므로, EP 취소가 완료되고 여권을 돌려받은 상태에서 진행하는게 수월하다. 회사 HR담당자의 이야기로는 서류 미비는 대부분 제출할때 걸러지고 제출이 완료된 후에 서류 문제로 출금신청이 거부되거나 연기된 적은 지금까지 없었다고 한다.

말레이시아 시민권자가 아니면 온라인 제출을 할 수 없으니 방문하고자 하는 지점에 appointment를 온라인으로 신청하고 방문해야 한다. 한가지 주의할 점은 9K AHL문서를 작성할 때 “Foreign worker”가 아닌 “Expatriate”을 선택해야 한다는 점이다.

처리기간은 공식적으로 21 working days라는데 의외로 3일 만에 통장으로 입금되었다(금요일 신청 화요일 입금). 만약의 경우 출국일까지 처리가 안되어도 출국은 가능하다.

제출 서류
• KSWP 9K AHL.
• 여권번호 페이지 사본.
• Termination letter.
• Member contribution verification form by employer.
• (실물 여권 지참)

OpenVINO python을 이용한 inferencing 예제

OpenVINO를 이용해서 TensorFlow(Keras)로 training한 모델로 추론(inferencing)을 수행하는 간단한 예제를 작성해 보았다.

TensorFlow model을 freeze하기

Training된 모델을 model optimizer에 넣기 전에 freeze시켜야 하는데, output_node_names를 입력하라는 오류 메세지가 계속 뜬다면 제대로 freezing을 수행했는지 확인해 보는게 좋다. 알아보기 쉽게 하기 위해 입출력 layer에 ‘name=’ parameter로 다음과 같이 이름을 지정해 주었다.

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28), name='input'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax', name='output')
])

그러면 layer의 이름들을 출력할 때 다음과 같이 나온다. 전체 MINST model training과 freezing 과정은 이 CoLab에 적어 두었으니 참조.

------------------------------------------------------------
Frozen model layers:
x
sequential/input/Const
sequential/input/Reshape
sequential/dense/MatMul/ReadVariableOp/resource
sequential/dense/MatMul/ReadVariableOp
sequential/dense/MatMul
sequential/dense/BiasAdd/ReadVariableOp/resource
sequential/dense/BiasAdd/ReadVariableOp
sequential/dense/BiasAdd
sequential/dense/Relu
sequential/dropout/Identity
sequential/output/MatMul/ReadVariableOp/resource
sequential/output/MatMul/ReadVariableOp
sequential/output/MatMul
sequential/output/BiasAdd/ReadVariableOp/resource
sequential/output/BiasAdd/ReadVariableOp
sequential/output/BiasAdd
sequential/output/Softmax
Identity
------------------------------------------------------------

모델 옵티마이저(mo-tf.py)

Freeze된 모델을 다운로드 받은 후에 TensorFlow용 model optimizer인 mo-tf.py를 실행 시키면 model을 나타내는 xml file과 weight값을 저장하는 bin file이 생성된다. 이 때 training된 모델은 입력 shape을 [-1, 28, 28]로 알고 있기 때문에 음수가 아닌 값을 넣어 달라는 에러가 생긴다. –input_shape parameter를 다음과 같이 적어준다.

/opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py --input_model ./model/mnist_model/frozen_graph.pb  --input_shape [28,28]

OpenVINO를 이용한 inferencing

Model optimizer가 수행되었다면 이제 xml file을 이용해 model을 load하고 inferencing을 수행하면 된다. 다음은 Training 후 freezing과 model optimization이 수행된 XML file을 이용해서 inferencing을 수행하는 간단한 코드이다.

출력결과

$ python3 ./infer_mnist.py ./model/mnist_model/frozen/frozen_graph.xml

        Model path= ./model/mnist_model/frozen/frozen_graph.xml 
        Device= CPU
Accuracy: 0.9789 (hit: 9789/ miss: 211)

stb library를 이용한 간단한 이미지 읽고 쓰기

stb는 라이센스 걱정없이 사용할 수 있는 간단한 이미지 읽고 쓰기, 폰트, vorbis등에 대한 퍼블릭 도메인 구현으로 간단한 이미지 처리 등을 지원하기 위해 임베디드 시스템 등에서 고려해 볼만 하다. 다음은 테스트용 이미지(아무 포맷)를 읽어서 BMP로 저장하는 예제이다.

XCode에서 OpenCL 개발환경 설정과 간단한 디바이스 정보 출력 예제

  1. XCode에서 새로운 프로젝트를 생성하고 macOS의 Command Line Tool을 선택한다.
  2. Project를 선택하고 ‘Build Phases’ -> ‘Link Binary With Libraries’에서 더하기(+)를 선택한 후 OpenCL framework을 선택한다.

아래의 예제 코드는 OpenCL programming by example의 2장에 나오는 내용을 약간 변경한 것으로 AMD 라데온 Pro 455와 Intel HD graphics 530두 개의 GPU가 달린 2016년 맥북프로에서 실행하면 다음과 같은 결과가 출력된다.

Number of platforms: 1
3 devices found in platform0
	Name: Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
	Type: 2
	Image support: 1
	Vendor: Intel
	Driver ver.: 1.1
	Device ver.: OpenCL 1.2 
	Compute units: 8
	Max clock: 2700 MHz
		Denorms: 1
		INF and quiet NaNs: 1
		Round to nearest: 1
		Round to zero: 1
		Round to INF: 1
		FMA: 1

	Name: Intel(R) HD Graphics 530
	Type: 4
	Image support: 1
	Vendor: Intel Inc.
	Driver ver.: 1.2(Aug 31 2020 22:26:30)
	Device ver.: OpenCL 1.2 
	Compute units: 24
	Max clock: 1050 MHz
		Denorms: 1
		INF and quiet NaNs: 1
		Round to nearest: 1
		Round to zero: 1
		Round to INF: 1
		FMA: 1

	Name: AMD Radeon Pro 455 Compute Engine
	Type: 4
	Image support: 1
	Vendor: AMD
	Driver ver.: 1.2 (Sep 11 2020 22:04:49)
	Device ver.: OpenCL 1.2 
	Compute units: 12
	Max clock: 855 MHz
		Denorms: 1
		INF and quiet NaNs: 1
		Round to nearest: 1
		Round to zero: 1
		Round to INF: 1
		FMA: 1

Program ended with exit code: 0

저장공간 문제로 XCode 재 설치가 실패 할 때

XCode를 재설치 할 때 가능한 저장공간이 25GB이상 있음에도 저장공간이 부족해서 설치할 수 없다는 에러가 나온다면 제대로 삭제되지 않은 이전의 정보 때문일 수도 있다.

Uninstall xcode 10에 있는 내용을 참고해서 ~/Library/안에 있는 관련한 파일들을 삭제해주고 나니 저장공간에 대한 에러메세지 없이 잘 설치 되었다. /System/Library/안에 있는 파일들은 SIP 관련으로 그냥 삭제할 수 없고 복구모드로 부팅해서 csrutil을 실행해 주어야 한다는데 그냥 안해도 문제 없이 잘 되었다.

다음의 파일을 지우고 한번 시도해보자.

/Applications/Xcode.app 
~/Library/Caches/com.apple.dt.Xcode
~/Library/Developer
~/Library/MobileDevice
~/Library/Preferences/com.apple.dt.Xcode.plist
/Library/Preferences/com.apple.dt.Xcode.plist