Intro

협업하는 팀의 사정으로 원래 쓰던 tensorflow를 놔두고 pytorch로 갈아타게 되었다. 때문에 포스트의 제목이 이런 식이다.

사실 tf v1 때는 변수 만드는 방법부터 배워야 할 정도로 사용성이 아주 부족했는데 keras의 등장 및 v2에서의 편입 이후로 레토르트 식품 데우듯이 쉽게 ML 모델 개발이 가능해졌다. 이러나 저러나 복잡한 모델을 만들지 않는 이상tensorflow와 pytorch 모두 주인장에게는 cuda를 편하게 쓰게 해주는 도구에 지나지 않고 이쯤 시간이 흘렀으면 사용성이 엇비슷하지 않을까 하는 생각에 1시간 정도 걸리리라 생각했다.

 

당장 튜토리얼부터 마음에 안들었다.

 

pytorch tutorials

동영상 자료는 재끼고, Basic에는 대뜸 Tensor 설명부터, Example에는 간단한 Iris, MNIST는 있지도 않다. 그나마 있는 example은 Image Classification. numpy랑 연동이 잘 된다고 하기엔 받아먹는 data형 제한이 너무 귀찮았고 (Linear function은 float32가 아니면 안받더라) 구조도 와닿지 않는다. keras에 익숙한 사람은 누구나 pytorch로 넘어가며 고구마 100개 순간을 경험하리라 생각해 간단한 Iris classification tutorial을 여기에 올려둔다. 구조적 특성이나 보는 관점은 전부 tensorflow에 익숙한 사람의 의견이라 처음부터 pytorch를 쓴 경우 '이 사람은 왜 이런 소리를 하나?' 생각을 할 수 있겠으나 주인장과 같은 전처를 밟은 사람이라면 이해하리라 기대한다.

 

Example

import torch
from torch import nn as nn
import torch.nn.functional as F
from sklearn import datasets
import numpy as np

# Define Model
class Clf(torch.nn.Module):
    def __init__(self):
        super(Clf, self).__init__()
        self.fc1 = nn.Linear(4,10)
        self.fc2 = nn.Linear(10,3)

    def forward(self,x):
        return self.fc2(F.relu(self.fc1(x)))

# Load Data
iris = datasets.load_iris()

X = torch.tensor(iris.data, dtype=torch.float32)
y = torch.tensor(iris.target)

# Setup Model, Optimizer, Loss function
clf = Clf()
optimizer = torch.optim.Adam(clf.parameters(), lr = 0.01)
loss_fn = nn.CrossEntropyLoss()

# Train
for _ in range(1000):
    y_pred = clf(X)
    loss = loss_fn(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

print(np.argmax(y_pred.detach().numpy(),1))

dataset은 scikit-learn에서 들고오는 방식을 택했다. train test split, metric 등은 모두 무시하고 150개 데이터 전체를 한번에 학습시키는 단순무식한 코드임을 감안해서 보면 좋겠다.

 

Model

tensorflow 의 keras와 동일하게 모델을 정의하고 모델 구조를 짜서 넣어준다. 하나 차이점은 one-line으로 모델을 만들지는 못하고, nn.Module을 상속받는 class를 만들고, forward 함수를 구현해서 모델을 짜야한다는 점이다. forward 함수를 한줄로 짠 것을 보면 주인장의 귀찮음을 볼 수 있다. 모델은 별 문제없이 넘어갈 수 있다.

 

Data Loading

data를 넣을 때부터 슬슬 짜증이 나기 시작한다. scikit-learn에서 제공하는 iris 데이터는 numpy.ndarray 형태이다. X데이터는 float64, y데이터는 int64의 형태를 가지고 있다. 문제는 모델에서 사용한 nn.Linear가 망할 float32만 받는다는 것이다.

 

# Load Data
iris = datasets.load_iris()

X = torch.tensor(iris.data, dtype=torch.float32)
y = torch.tensor(iris.target)

때문에 tensor로 바꿀 때 dtype 을 명시하거나 처음부터 np.astype 함수를 사용해서 float32로 바꾸어서 들고와야한다.

 

Model setup

loss function을 정하고 optimizer를 정하는 것은 tensorflow와 유사하다. 원하는 것을 가져다가 쓰면 된다.

한가지 유의점은 keras의 경우 model 안에 loss function과 optimizer가 같이 포함되는데 pytorch에서는 이들이 다 따로 논다.

clf = Clf()
optimizer = torch.optim.Adam(clf.parameters(), lr = 0.01)
loss_fn = nn.CrossEntropyLoss()

 

Training

# Train
for _ in range(1000):
    y_pred = clf(X)
    loss = loss_fn(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

tutorial의 training 파트의 코드를 볼 때는 문제가 없었는데 막상 짜다보니 멘붕이 왔다.

 

잠깐, 나 optimizer에 아무것도 안 넣었는데..?

 

더보기

clf(X) 호출을 통해서 y_pred를 구한다. foward 함수가 아마 호출이 될 것이다.

loss_fn도 이해가 된다. y_pred와 y_true(=y)를 넣어서 loss를 구한다.

optimizer.zero_grad()는 아마도 무언가 initialize를 하는 부분일 것이고,

loss.backward()는 함수명으로 보아 error를 통한 미분값을 구할 것 같은데(backward propagation) weight을 어떻게 알아서 미분값을 구하지?

심지어 loss 값은 optimizer에게 전달되지도 않았는데 혼자서 step() 함수를 호출하고 있다.

 

keras에서는 하나의 모델 안에 loss 함수와 optimizer가 같이 존재한다.

model = keras.Sequential(
    [
        keras.Input(shape=(4,)),
        layers.Dense(200, activation="relu", kernel_initializer=keras.initializers.random_normal(mean=1)),
        layers.Dense(200, activation="relu", kernel_initializer=keras.initializers.random_normal(mean=1)),
        layers.Dense(2,name='output')
    ]
)

model.compile(
    optimizer=keras.optimizers.SGD(learning_rate = 0.001),
    loss=keras.losses.MeanSquaredError(),
    metrics=[keras.metrics.MeanSquaredError()]
    )

심지어 metric 함수까지 포함되어 compile 과정을 거치면 model.fit()을 호출하는 것으로 loss와 optimizer가 작동하고 metric을 알려주는 기능까지 겸하고 있다. keras는 model만 들고다니면 그 안에 모든 함수와 weight들이 묶여서 돌아다니는 구조인데 pytorch는 쉽게 납득하기 어려운 형태를 취하고 있다.

 

pytorch 내부를 뜯어보고 document를 뒤적이고, pytorch를 많이 쓰는 아는 동생에게 물어본 결과 겨우 작동 방식을 이해했다.

왜 이렇게 만든 것인지는 전혀 와닿지는 않지만 말이다.

 

먼저 gradient descent를 위해서는 세 step이 필요하다. 1) error, 혹은 loss를 계산하고, 2)이를 통해 gradient 값을 구한 뒤, 3) 일정한 learning rate을 유지하든 momentum을 더하든 실제로 weight을 수정하는 것이다.

 

keras의 경우 loss function은 loss를 계산하는 부분(1)만 담당하고, gradient를 구하고, 적절한 learnint rate에 맞게 수정하는 부분(2,3)은 optimizer가 담당하고 있다.

 

pytorch는 다르다. loss function에서 1과 2를 담당하고, optimizer가 gradient만 사용해서 실제 parameter를 수정한다.(3)

 

코드 실행 순서를 거꾸로 올라가면 다음과 같다.

1. optimizer가 주어진 gradient 값을 사용해서 parameter를 수정한다.

optimizer.step()

optimizer가 처음 만들어졌을 때 clf.parameters()를 넣었는데, 이는 모델의 parameter를 참조하는 값이다. 때문에 optimizer는 clf 의 parameter를 수정할 수 있다. 수정에 사용하는 gradient 값은 parameter 안에 들어있다.

params = [i for i in clf.parameters()]
print(type(params[0]))
print(params[0].grad)

위 코드를 실행하면 torch.nn.parameter.Parameter 형태로 clf 내부가 표현되는 것을 알 수 있으며, 이는 Tensor의 일종으로, backward 함수를 실행하면 grad 값이 생긴다. loss.backward()를 실행하지 않으면 params[0].grad는 None으로 설정되어 있을 것이다.

 

2. loss 값을 사용해서 gradient를 구한다.

loss.backward()

그렇다면 어떻게 loss를 통해 구한 gradient가 clf의 weight까지 가는가?

loss는 Tensor type이다. 중요한 점은 이 Tensor가 단순히 data만을 담고 있지 않고, 어느 과정을 통해서 이 값들이 구해졌는지에 대한 정보를 가지고 있다는 것이다. 설마설마 하긴 했는데 이 변수 안에 어떻게 보면 이 값이 나오게 된 역사(?)가 담겨있다. (이러면 memory issue는 괜찮나...?)

tutorial에서도 제대로 알려주지 않는데 이를 확인하는 방법은 다음과 같다.

(Deep Learning with PyTorch: A 60 Minute Blitz 글 안에는 있다!)

loss.grad_fn.next_functions

Tensor object인 loss에는 grad_fn이라는 필드가 있는데, 이 function 안의 next_functions field에는 이 뒤에 호출해야할 function들의 참조가 달려있다. 물론 이 순서는 해당 Tensor가 만들어진 순서의 역순이다. 이렇게 next_functions 를 따라가면 아래의 순서로 loss가 구해졌음을 알 수 있다.

 

grad_fn 호출 stack

때문에  loss.backward()만 호출하면 각 parameter Tensor에 grad 값이 전파된다.

각 grad_fn에 대한 자세한 설명은 공식 document에도 나와있지 않지만, AccumulateGrad가 있는 부분마다 실제 error에 의한 grad 값들이 존재하는 것으로 보인다 (각 linear layer마다 weight에 해당하는 Tensor와, bias에 해당하는 Tensor가 있을 것이다.)

3. clf를 구성하는 Tensor들의 grad 값을 초기화 한다.

optimizer.zero_grad()

optimizer와 loss function이 따로 놀기 때문에 현재 parameter가 가지고 있는 gradient를 초기화 시켜주는 함수가 존재한다. 때문에 이 함수를 먼저 호출하고, 이 뒤에 loss를 backpropagation 시키는 방식으로 코드를 작성해야한다.

 

이 이후는 keras를 쓰던 유저도 쉽게 이해하리라 생각한다.

 

마치며

pytorch를 사용한 ML 논문이 이미 tensorflow를 사용한 논문의 수를 넘었다고 한다. 익숙하지 않은 구조 때문에 하루를 날리며 대체 왜 pytorch를 쓰는가에 대한 글을 찾다가 pytorch의 장점으로 동적인 computation graph를 언급하는 글을 보았다. 어쩌면 keras처럼 Model 종속적인 형태가 아니라 연산 값에 연산과정이 들어있는 구조 때문에 동적 computation graph가 가능한 것인가 하는 생각이 든다. 하나의 작은 산은 넘은 것 같다.

 

 

Posted by Knowblesse
취미/Technology | 2022. 1. 11. 11:58 | /40

#스타트업 #힙스터 #팀워크 #생산성

스타트업'스러움'이 하나의 문화컨텐츠로 떠오르면서 온갖 제품과 서비스들이 이러한 분위기에 맞추어지고 있다. 마치 Helvetica 폰트가 디자이너들에게 사랑받기 시작하면서 세계를 장악하는 현상을 보는 것만 같다. 실제 생산성을 높이기 위함이든, 본인의 '힙함'을 보여주기 위함이든 여러 제품을 구입하고, 서비스를 구독하기 시작하면 월 구독료로 나가는 돈은 적지 않을 것이다. 또한 개중에는 이러한 문화적 흐름에 편승해서 그럴듯하게 포장한 예쁜 쓰레기를 제공해주는 곳도 많아서 사용자로 하여금 더 많은 판단을 요구한다. 자칫 생각없이 모든 것을 수용하다가는 생산성 앱으로 도배된 생산적이지 않은 본인의 기기를 보게 될 것이다.

 

변화에 슬슬 더디게 반응하기 시작하는듯한 기분을 떨쳐내기 위해 오래전부터 이야기를 듣고 추천을 받아온 Notion을 쓰기 시작했다. 당장에 연구실 지식베이스와 소통을 위한 목적으로 어렵게 도입했던 Slack부터 스타트업에 잠시 참여했을 때 접했던 트렐로, 2011년 1월부터 사용중인 에버노트와 iOS 한글 지원문제로 갈아탔던 OneNote까지 온갖 유사 프로그램들 접했는데 각자 지향하는 바가 분명하게 다른 것 같다. 다른 앱과 함께 하루 Notion을 써본 소감을 간략히 적는다.

 

* 트렐로 : 협업용 TODO 리스트

* Keep : 동기화 되는 포스트잇 게시판

* Evernote : 동기화 되는 간단한 메모장

* OneNote : 화이트보드

* Slack : 조금은 DB의 형태를 갖춘 카카오톡

* Todoist / TickTick : 혼자쓰는 TODO 리스트

Notion : 잘 정리된 Blog 글 같은 Evernote

현재 각자 사용목적성이 뚜렷하고 열심히 쓰고 있는 두 앱이 OneNote와 Evernote여서 그런지 자꾸 이 둘과 비교를 하게 된다. Evernote의 경우 기사를 대충 스크랩해서 처박아두거나, 짧은 메모, 일기 등의 줄글 위주의 게시물, 혼자 보는 용도의 설명서를 담아둔다. '동기화가 되는 간단한 메모장'이 가장 확실한 설명인 것 같다. 노트를 예쁘고 깔끔하게 만들기 위해서는 추가적으로 서식을 변경하거나 하는 등의 노력이 많이 들어간다. 그런데 그럴 일은 없다. 대충 넣어두고 나중에 필요하면 찾으면 되고, 잘 정리된 문서가 필요하면 워드로 작성하면 된다. 첫 번째 책상서랍 같은 존재다. 때문인지 유료플랜을 결제할 때는 매번 망설인다. 해주는 기능도 얼마 없으면서 이 가격을 받아야 하나 싶다.

 

OneNote의 경우는 아이디어 상자이다. 화면 아무 곳이나 클릭하면 바로 글이 써지고 Indent 조절이 쉽게 되고 이리저리 컨텐츠 박스를 끌고 다닐 수 있다는 점이 매력이다. 화이트보드 같은 매력이 있다. 하지만 이러한 점은 화면이 작은 모바일 기기로 볼 때 확실히 단점으로 작용한다. 화면안을 이리저리 돌아다니면서 글을 읽는 것은 정말 불편하다. 그래도 Evernote에 비해서는 깔끔한 문서정리가 가능하기 때문에 자주 꺼내보아야 하는 자료의 경우는 OneNote에 정리해서 넣어둔다.

 

짧은 메모, 텍스트 위주의 정보, '대충 넣어두어도 나중에 필요하면 뒤지겠지...' 하는 수준의 정보는 Evernote.
빠른 아이디어 작성, 위계관계가 확실한 정보, 조금은 정리해서 넣어두어야 하는 정보는 OneNote.

 

 

Notion은 OneNote와 Evernote 어딘가에 어중간하게 있다. 많은 사람들이 마크업 기능을 장점 중 하나로 꼽는데 확실히 여타 다른 앱들에 비해서 월등히 편리하다. 그 외에 sorting이 지원되는 깔끔한 표 삽입 기능과 댓글기능, 페이지 간 링크 등은 앞서 언급한 많은 앱들의 필수 기능들을 하나로 통합해서 왜 이런 앱이 이제야 나왔는지 싶다. 하지만 '이렇게 참신하고 대단한게 나오다니!' 보다는 '이런게 왜 이제야?'에 가깝다. 다양한 템플릿을 지원한다는 점에서는 OneNote와 가깝고 심플하다는 것에 Evernote와 비슷한 느낌을 준다. 하지만 전반적인 감상은 OneNote보다는 Evernote에 가깝다고 할까. OneNote의 '화이트보드'스러움이 있었다면 Evernote와 OneNote를 통합해서 사용할 수 있었겠으나 아이디어를 이리저리 끌고다니는 기능은 없는듯 하다. 하긴 앞서 언급한 모바일환경에서의 불편함을 생각하면 좋지 않은 방법일 수도 있겠다. Notion에서는 확실히 '협업용'의 분위기가 물씬 풍긴다. 내 난잡한 Evernote 글을 동료에게 준다면 한소리 들을 것이 분명하고, 마크업이 제대로 되지 않고 외부자료를 넣기 힘든 OneNote는 장기적인 데이터 유지 관점에서는 분명 좋지 않은 선택이다. Notion은 원활한 정보전달에 필요한 만큼의 미적 요소를 가미해서 글 작성이 가능하다. 왜 이렇게 붐을 일으켰는지 알법하다.

 

하지만 Notion이 얼마나 내가 쓰는 기존 프로그램들을 대체할 수 있을지는 의문이 든다. '협업'의 필요성이 크지 않기에 기존 두 프로그램들로도 충분한 목적을 달성했다. 또한 마크업 기능도 미를 위해 할애하는 시간을 해치지 않을 만큼 쉽게 되어있기는 하지만 미가 필요할 수준의 내용이면 아에 문서로 작성을 하고, 그런 것이 아니라면 짤막한 메모로도 충분하다. 그나마 이번에 진행하는 프로젝트의 일원이 Notion을 쓰는 것 같던데 이 프로젝트를 위해서 사용하는 것이라면 Notion을 충분히 쓰겠으나 OneNote나 Evernote를 내려놓기에는 조금 힘들 것 같다. 다만 메모장 프로그램에 매달 돈을 지불해야하는 점이 괘씸하기에 Evernote는 Notion로 대체를 시도하려고 한다.

Posted by Knowblesse

3rd-generation Antihistamine

항히스타민제만큼 구하기 쉬우면서 부작용을 신경써야하는 약은 없을 것이다. 비염이나 알레르기 증상을 완화하려고 먹었다가 쏟아지는 졸음을 겪거나 나른해진 경험은 누구나 한번쯤 해봤을 것 같다. 아스피린의 최대의 부작용인 속쓰림을 개선해서 다양한 진통제가 나왔듯이 항히스타민제도 '세대'라는 말이 붙을 만큼 다양한 약들이 나오고 있다. 그렇게까지 알레르기 반응이 심하게 나와 본적이 없고, 가능하면 알러젠을 차단하거나 보호장구를 사용해서 대처를 하기에 항히스타민제에 관심이 없었으나 우연한 사건으로 관련 정보를 찾아보게 되었다.

 

나는 몸 상태에 따라 적절한 약을 먹을 수 있도록 단일제제의 약을 구비해두는 것을 좋아하는데, 3세대 항히스타민제 중 일반의약품으로 분류되어 판매가 되는 약은 펙소페나딘염산염인 '알레그라'가 거의 유일했다. 일부 커뮤니티에서는 카피약도 나와있다고 하고 실제 한미약품에서 펙소나딘정으로 제네릭 약품이 나와있기는 하다만 구하기 쉽지 않아 보였다.

 

왜 120mg만 일반일까? 약학계도 상품의 유통구조와 제약회사의 이익관계, 안정성 등이 복잡하게 엮긴 것 같다.

 

이전에 우루사를 구입하려고 했는데 200mg는 전문, 100mg는 일반 이라는 설명을 듣고 의야해 했는데 알레그라는 더욱 웃겼다. 30mg과 180mg는 전문, 120mg은 일반이라고 한다. 병원을 방문할 시간이 없었기에 일단 근처 약국 6개를 돌며 120mg 알레그라를 사기 위해 돌아다녔는데 전부 전문의약품 형태만 있다며 구입을 하지 못했다.

 

비염에 고통받는 사람들이 많은지 관련 커뮤니티에서도 약을 구하기 힘들다는 반응을 털어놓았는데, 한독약품에 문의를 한 결과 120mg은 일반의약품이 맞지만 판매형태가 조제용이라 처방을 받고 사야한다는 답변을 받았다. 조제용 포장을 소분해서 판매하는 행위는 불법이라는 점(처방 제외)은 아는데 조제용 포장을 그대로 파는 것도 불법인지는 모르겠다. 몇몇 사람들이 120mg 일반의약품을 30정이 든 조제용 포장으로 샀다는 글을 올렸는데 조제용 포장으로 판매하는지 여부는 약사 재량인가보다. 아니면 얼렁뚱땅 판매를 하셨거나.

 

한독약품 홈페이지에 관련 문의글은 많았으나 전부 비밀글로 올라와 있었는데 본인처럼 약을 구하시는 분들이 헛걸음하지 않도록 아래 답변 내용을 적어둔다.

 

한독 의약품은 (주)쥴릭 도매상을 통해 전국 유통되고 있으므로
쥴릭으로(전화: 080-2006-080) 연락하시어 거주지역에서 구입 가능한 약국을 문의해 주시기 바랍니다.

참고로, 현재 일반의약품으로 분류되는 알레그라정120mg은 처방조제용 포장(30정,100정)으로만
유통중인 관계로 일반 판매가 어려운 상황입니다.
번거로우시겠지만, 가까운 병원을 통해 처방 후 조제 받으시길 안내 드립니다.

22년 01월 10일 기준 답변

 

 

 

 

 

[1] Olasińska-Wiśniewska, Anna & Olasiński, Jerzy & Md, Phd. (2014). Cardiovascular safety of antihistamines. Postepy Dermatologii I Alergologii. 31. 182. 10.5114/pdia.2014.43191. 

Posted by Knowblesse
Mind Storage/Short Thoughts | 2021. 12. 12. 15:22 | /38

비로소 바닥이 보일 때야 관리 계획을 마련하게 된다.

 

지난 생각도 그렇고 오늘 생각도 시간 관리에 대한 이야기이다.

 

시간 관리와 관련된 가장 잘 알려진 방법 중 하나로 스티븐 코비의 시간관리 매트릭스를 꼽을 수 있을 것이다. 모든 일들을 중요함과 긴급함이라는 두 축을 가진 평면에 늘어놓고 급박하고 중요한 일, 급하지 않지만 중요한일, 급박하지만 중요하지 않은일, 그리고 급박하지도 중요하지도 않은 일 순으로 처리하라는 이야기이다. 고등학생 때인가 아버지의 권유로 프랭클린 플래너를 쓰면서 이 매트릭스를 사용해본 적이 있었는데 지금와서 봐도 전형적인 그것이다.

 

경영학의 Bullshit.

 

애시당초 중요하지 않은 일은 하지 않으면 된다. 해야할 일이었다면 중요한 일이었겠지. 그리고 급박함과 중요함은 양의 상관관계가 매우 커서 급박한데 중요하지 않은 일은 없다. 스티븐 코비의 매트릭스를 보아도 '급박하지만 중요한 일'로 SNS 메시지 따위를 예로 들고 있다. 이런 것은 안하면 되는 것이다. 또한 일의 중요함은 그렇게 쉽고 빠르게 평가되지 않는 것 같다. 아이디어 회의는 중요도가 떨어질 수 있겠지만 이 회의에서 미래 프로젝트 방향에 중요한 영향을 끼치는 아이디어가 나올 수도 있는 일이고, 무언가를 결정하는 회의는 내가 없어도 옳은 방향으로 결정되어 잘 돌아갈 수도 있다.

 

'공부법' 키워드로 검색을 하면 수 십만건의 책과 글들이 쏟아져 나오지만 정작 공부를 오래 해본 사람은 자기에게 딱 맞는 방법을 이미 형성시킨다고 믿는다. 시간 관리 또한 시행착오를 통해 내게 맞는 방법을 찾을 수 있으리라 생각한다. 하나의 시행착오 중 하나로 아래의 분류법을 만들어 보았다.

 

P0 : 지금 당장 착수해야하는 일 || 안했을 시 이를 되돌리기 위해 두 배 이상의 자원을 투자해야하는 일

P1 : 3일 이내에 해결해야하는 일 || 언젠가는 해야만 하는 일

P2 : 일주일 이내에 해결해야하는 일

P3 : 한달 이내에 해결해야하는 일

PX : 안해도 상관 없는 일

 

 

'Mind Storage > Short Thoughts' 카테고리의 다른 글

[키워드 에세이] 즐거움  (0) 2021.11.25
일요일을 혼자 보내는 방법.  (0) 2021.10.10
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse

  가깝게 지내는 작가 선생님께서 매일 하나의 키워드를 받아 짧은 에세이를 쓰는 작업을 하시고 있다는 이야기를 듣고 뱁새가 황새 따라가듯 같이 참여해보기로 하였다. 1년동안 쓴 글보다 쓴 코드가 더 긴 과학하는 사람에게 과연 얼마만큼의 글재주가 있겠냐 싶겠지만 자꾸 황새를 따라다녀야 몸은 뱁새더라도 정신만큼은 황새가 되지 않을까. 그리고 솔직히 뱁새가 외관은 더 귀엽다.

  삶에 영향력을 주고 있다고 생각하는 말과 실제로 영향력을 끼친 말 사이에는 큰 차이가 있을 것 같지만 확실히 이 둘 모두에 해당된다고 생각하는 문구가 있다. "아름다운 것을 봐야 아름다운 일을 해내고, 위대한 것을 느껴야 위대한 일을 해낸다." 때로는 분수에 맞지 않은 와인을 사거나, 과한 가격의 취미생활을 정당화 하는 변명으로 오용하지만 아름답다고 느끼는 것들의 범주가 넓고 다양해지는 것을 체감할 때면 이론(論)은 생각나지 않는다.

 

  즐거움은 내 삶의 가장 중심이 되는 키워드이다. 때문에 오랫동안 나에게 있어서 즐거움의 의미를 생각해왔었다. 마약이라는 아주 간단하고 확실한 즐거움이 있음에도 시작하지 않는 이유가 과연 두려움 때문인지, 위대함을 느끼기 위해 소비하는 것과 즐거움이 어떻게 연결되는지, 무언가를 만드는 일들이 내게 큰 즐거움을 주는 이유가 무엇인지 등 다양한 주제로 생각을 해서 내린 결론은 결국 확장성이었다.

 

  사람 수 만큼 다양하게 즐거움을 느끼는 방법들이 있으나, 일부는 일회성의 즐거움으로 끝이나고, 일부는 반드시 즐겁지 않음이 뒤따라오며, 거의 대부분의 경우는 반복할 경우 그 즐거움이 사라진다. Reward expectation과 Dopamine과의 상관관계를 보여준 Schultz의 연구를 보면(Schultz, 1997) 처음에는 과일 주스에 반응하던 원숭이의 VTA 뉴런이 과일 주스가 곧 나옴을 알려주는 소리에만 반응하기 시작하는 것을 볼 수 있다. 물론 VTA 뉴런과 즐거움이 완벽히 대응되지는 않겠지만, 이전에 좋아했던 일들에 대한 선호가 사라지는 만큼 그 즐거움과 연결된 다른 일들로 즐거움이 확장되지 않을까? 어쩌면 과일 주스만 좋아하던 원숭이가 소리에 대한 선호를 확립하고 나서부터는 '좋은' 소리와 '나쁜' 소리에 대한 뚜렷한 취향이 발현될지도 모르는 일이다. 나도 이처럼 즐거움이 또 다른 즐거움을 불러일으킬 때 비로소 진정한 즐거움을 느낀다고 생각한다.

 

  다소 대하기 어렵더라도 독특한 경험을 주는 이상한 사람을 만나는 것을 좋아하는 이유도, 홍차를 마시면서 다양한 맛과 향의 세계로 여행을 하는 이유도 결국 지금의 즐거움이 또 다른 새로운 즐거움으로 이어질 것이라는 확장성에 대한 기대 때문인것 같다. 더 자극적인 즐거움, 더 컬러풀한 즐거움에 대한 욕망은 항상 느끼고 있으나 이후에 다른 즐거움을 가져다 줄 것이라는 기대가 없으면 시도를 망설이게 된다. 이렇게 글을 쓰기 시작한 것도 당장은 강렬한 즐거움을 가져다 주지 않지만 글을 쓰면서 이후에 발견하지 못한 또 다른 즐거움을 주지 않을까 하는 기대 때문이지 않을까?

'Mind Storage > Short Thoughts' 카테고리의 다른 글

21DEC12  (0) 2021.12.12
일요일을 혼자 보내는 방법.  (0) 2021.10.10
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse
Mind Storage/Logs | 2021. 10. 28. 10:59 | /36

- 스케줄러 사용을 다시 시작해야겠다는 생각을 했다.

학부생 때는 스타벅스 다이어리를 애용했는데 언젠가부터 스타벅스 굿즈가 인기몰이를 시작한 후로 다이어리 구하기가 어려워지자 스케줄러 사용도 같이 그만둬 버렸다. 일정은 구글 캘린더를 사용해 관리를 하고 있지만, 실험 프로젝트를 짜거나 하루 생산성을 되돌아보는 용도로는 턱없이 부족하다. 일전에 프랭클린플래너를 사용해본 적이 있었지만 일정과 스케줄의 경계가 애매해지고 들고다니는 것이 불편해지자 효용이 사라졌다.

프랭클린플래너의 사용법도 회사원이 아닌 나에게는 전혀 맞지 않았고, 일정 관리 관련 자기개발서는 절대 읽고 싶지 않기에 나만의 계획법을 구상하다가 몇 가지 항목들을 생각해보았다.

 

더보기

* Daily

- 오늘 하려고 계획했던 일

- 실제로 오늘 한 일

- 실제로 오늘 했으면 좋았던 일 (우선순위 적으로)

- 계획대로 일을 하지 못한 원인

- 개선방안

 

* Monthly

- 다가오는 일

- 각각 준비에 걸리는 subgoal과 그 기간

 

* Yearly

 

- 취미의 다양성

TRPG에, 악기에, 소설에 너무 다양한 취미들을 누리려 하니 취미가 하나의 일처럼 뭉쳐진것 같다는 느낌을 받았다. 취미 계획(?)도 필요하지 않을까.

Posted by Knowblesse

일요일을 혼자 보내는 방법.

아침의 늑장은 대게 이유가 있는 법이다. 누군가는 원래 아침은 체질상 약하다고 이야기 할 수 있겠지만, 과연 그도 소풍 전날, 새벽 비행기 타기 전날 보통날처럼 늑장을 부릴까. 약속이 없으며, '쉬는' 일정조차 없는 일요일. 전날 11시에 누웠음에도 불구하고, 8시에 이미 깨어있었음에도 불구하고, 자동 조명 장치가 8시 45분에 맞춰 모든 불을 켰음에도 불구하고, 오후 2시가 되어서야 침대에서 기어 나올 수 있었다. 


창문을 너무 오래 닫고 있어서 산소 농도가 떨어졌나 하고 손목의 스마트 워치를 봤지만 디스플레이에는 높은 산소 포화도가 적혀있었고, 바디 배터리 값은 4시간 전부터 100%를 유지하고 있었다. 자취 초반에는 이러한 일이 익숙했다. 그 당시 연애를 하지 않아서도 있었겠다만 통학으로 버려진 시간만큼 하루가 길어져 주말에는 이렇다 할 일이 남아있지 않았다. 


세수를 하면서 냉장고 내용물을 기억해내며 아침을 결정, 감동란 두 알과 베이컨, 토마토 주스다. 이정도 메뉴면 평상시 아침에 비해 과하게 호화로운 편. 아 점심이니 딱히 그렇지도 않으려나. 전날에 설거지하다 남긴 식기를 정리하며 아침, 아니 점심을 같이 준비했다. 


'늑장의 이유는 역시 커피를 마시지 않았기 때문'이라는 핑계를 막기 위해 식사 후 커피부터 내렸다. 저 우악스러운 커피콩 가는 소리는 알람시계 대용으로 써도 되지 않을까 하는 생각을 하며 필터지와 드리퍼를 준비했다. 핸드드립 주전자는 팔을 끝까지 뻗어야 닫는 위치에 있으니 쓰지 말자. 팔을 반의 반만 뻗은 위치에 있던 전기포트의 물을 바로 담아 아침커피를 내렸다. 그래, 먹은 것은 점심이지만, 커피는 아침커피이다. 


어제부터 필터가 막혀 작동을 멈춘 수족관 여과기를 청소하고, 일주일치 옷들의 다림질을 마치고 화장실을 호텔처럼 바꿔두니 3시 50분을 넘어가고 있었다. 오늘을 위해 넣어둔 샴페인을 누구랑 마실까 생각을 하다가 불렀을 때 올 수 있는 사람이 없다는 생각에 미치자 책을 한권 가방에 우겨넣고 무작정 밖으로 나왔다.


일요일을 혼자 보내는 방법. 정말 어려운 주제이다. '일요일을 보내는 방법'과 '혼자 시간을 보내는 방법'의 두 가지가 겹쳐졌으니 말이다. 아이러니하게도 일요일이 아닌 날에는 일요일을 보내고 싶어하며, 약속과 연구 미팅이 잡힌 당일에는 막상 혼자있고 싶어하는데 이 두 가지가 합쳐지니 당혹스럽기 짝이 없다. 마치 민트초코마냥 둘이 섞이니 (사람에 따라 생각이 다르겠지만) 기어오는 혼돈이 탄생했다.


이럴 때에는 무언가 생산적인 일을 하러간다고 변명이 되는 서점이 최고다. 저녁 식사도 같이 외부에서 마칠 생각이었기 때문에 강남 교보문고를 선택했다. 역 근처 일본 스파게티 집에서 리조또를 먹고 서점으로 향했다. 요리에 나왔던 향신료를 찾아보고 싶어서 요리책 코너를 서성이다가 결국 미스테리/스릴러 서적 코너에 종착했다. 얼마 전 배송비를 아끼기 위해서 함께 구매했던 책이 매대 위에 올라와있는 것을 보고 스스로의 탁월한 선택에 실웃음을 짓고 산 책과 죽은 책의 비율을 잠시 생각한 뒤 빈손으로 카페를 찾았다. 


마음 같아선 최근 참여하게 된 TRPG모임 사람들과 게임도 하고 맥주도 같이 마시고 싶었는데 지금이 딱 시험기간이라 그런지 다들 여유롭지 않은가보다. 시험 전에 모임을 한번 잡아보려고 운을 띄웠으나 펌블이 나와버렸다. 다음에 시험 끝난 누군가가 방을 살릴 때까지 조용히 있어야겠다.


할일은 많지만 10월 10일 일요일을 다른 무언가를 하기 위한 날이 아니라 순전히 일요일 그 자체로 즐기고 싶었다. 결국 남은 것은 책 세 챕터를 읽은 것과 이 글 뿐이지만 IT 정보만 가득한 죽 같은 블로그에 감정 한 조각을 올렸다는 것으로 만족해야겠다.   

'Mind Storage > Short Thoughts' 카테고리의 다른 글

21DEC12  (0) 2021.12.12
[키워드 에세이] 즐거움  (0) 2021.11.25
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse

1. SimpleBlobDetector

parameter로 넣어준 조건에 따라 blob을 찾아줌.

알고리즘

  1. source image에 threshold를 적용.
    - parameter에 넣은 minThreshold 값(포함)과 maxThreshold 값(불포함) 사이를 thresholdStep으로 나누어 각각의 threshold를 사용해서 binary image로 바꾼다. 처음부터 binary를 넣어주려는 경우 기본 파라미터에서는 minThreshold=50, maxThreshold=220, thresholdStep=10 으로 설정이 되어있기에 이를 만져주어야 한다.
    binary image를 0과 255로 구성되도록 설정하고, minThreshold=253, maxThreshold=255, thresholdStep=1로 설정하면 최소한의 threshold 연산만 사용할 수 있다.
  2. 각각의 binary image에 대해서 findContours 함수를 적용해서 center를 계산.
  3. 각각의 binary image에서 찾은 contour들을 하나로 묶어줌.
    이때 minDistBetweenBlobs parameter를 사용한다.
  4. 찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정. 이를 keypoint로 return

예시코드

import cv2 as cv

parameter = cv.SimpleBlobDetector_Params()
parameter.filterByArea = True
parameter.filterByConvexity = True
parameter.filterByCircularity = True
parameter.filterByInertia = False
parameter.filterByColor = False
parameter.minArea = 500  # this value defines the minimum size of the blob
parameter.maxArea = 10000  # this value defines the maximum size of the blob
parameter.minDistBetweenBlobs = 1 # not used in binary image
parameter.minConvexity = 0.3
parameter.minCircularity = 0.3

detector = cv.SimpleBlobDetector_create(parameter)
detected_blob = detector.detect(denoised_mask)
print(len(detected_blob))

2. keypoint size

keypoint는 pt 값과 size 값을 가지고 있는데 (다른 값들도 있지만 이 연산에서는 무의미한 것으로 추정) pt는 blob center의 x, y 좌표를 의미하지만 도무지 size에 대한 이야기가 없다.

내가 원하는 정보는 찾아낸 blob의 크기 (이를 둘러쌀 수 있는 최소한의 원의 반지름 이라던가 실제 blob의 픽셀 수라던가...)인데 나오는 size 값은 blob의 모양에 따라서 제각각이다.

blob detection 을 한뒤 pt를 기준으로 size/2 만큼의 radius를 가지는 원을 그린 결과물

4번째 스텝인 "찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정." 에서 대체 무슨일이 일어나는 것이길래 이런 값이 출력되는지 모르겠다. 원 같은 경우는 그나마 비슷하긴 하지만 실제 위의 그림에서 볼 수 있듯이 지름 100px짜리 원의 blob 크기는 99.0151로 나온다. 여러 contour 들을 합치는 알고리즘을 들여다봐야 알겠지만 SimpleBlobDetector가 return하는 keypoint의 값만 사용해서 실제 blob의 크기를 알아낼 방법은 없는 것으로 보인다.

3. parameter의 minArea / maxArea

한 가지 주목할 점은 parameter로 사용하는 minArea / maxArea의 경우는 실제 blob으로 잡힌 object의 크기를 비교한다는 것이다. 한 변의 길이가 100px인 정사각형에 대한 keypoint의 size 값은 111.8034이지만 filterByArea 옵션을 켜고 minArea를 10000(100 * 100)으로 잡으면 정사각형을 찾지만, 10001을 사용하는 경우 정사각형을 찾지 못한다. circle의 경우는 사용한 radius를 사용해 수학적으로 계산한 넓이와 10 이하로 차이가 나는 것으로 보아 실제 pixel 수를 기준으로 filter 하는 것으로 보인다.

 

4. findContours 함수를 사용한 정확한 blob detection

때문에 내부에서 찾아낸 blob의 정확한 사이즈를 뽑아낼 수 있을 것이라고 기대했으나 실패했다.

사실 실제 4단계 step 중에서 사용하는 부분이 두 번째 step 뿐이기에 이쯤되면 그냥 findContous 함수를 써서 raw level에서 처리하는 것이 더 나을 것으로 보인다.

 

cnt = cv.findContours(binary_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]

# Some basic features of the contour object
(x,y), radius = cv.minEnclosingCircle(k)
rect = cv.minAreaRect(k) # ((center x, center y), (width, height), rotation)
size = cv.contourArea(k)

뽑아내야 하는 blob의 수를 알고 있다면 area, 둘러싸는 직사각형의 가로 세로 사이즈 등등의 값을 얻은 뒤 단계적으로 filter를 적용하는 방법도 사용할 수 있다.

 

 

Posted by Knowblesse

Google아 TF2.6이 나온지 언젠데 아직도 install 페이지에 TF2.4 설치방법이 있더라.

일 안하니?

 

 

망할 파이썬을 쓰다보면 인생의 교훈을 한가지 얻을 수 있다.

새로운 것 나왔다고 바로 쓰지말고 나온지 좀 된 것을 쓰자.

 

그런데 기왕 셋업하는 김에 좀 최신 것을 쓰려고 했다가 시간을 엄청 날렸다. TensorFlow 자체 documentation 은 금방금방 업데이트를 해주는데 설치방법은 왜 여전히 그대로인지... 내가 설치할 당시에는 2.5 기준으로 documentation이 나와있었는데 2.5는 CUDA 11.2 버전이 필요하고, 홈페이지에 나와있는 설치방법은 11.0을 기준으로 나와있어서 그대로 설치했다가는 'tf 2.5 에서는 cuda 11.2 버전이 필요합니다' 에러를 낸다.

 

문제는 이 cuda 11.2가 그당시 완성이 덜 되어있어서 몇몇 라이브러리가 없었는데 이 때문에 수동으로 라이브러리를 다운받아 이름을 변경하여 넣어야 돌아갔다. 세상에.

 

화난 개발자들이 올린 글들의 도움을 얻어 어찌저찌 설치를 했는데 왜 이 글을 쓰냐... apt-get autoclean과 apt-get autoremove 를 썼다가 수동으로 다운받아둔 라이브러리가 다 날아갔다. 이왕 다시 셋업 하는거 기록으로 남겨두자는 마음으로 글을 작성한다.

 

docker를 쓰는 쉬운 방법도 있다는 것 같지만 docker에 대한 필요성을 딱히 못 느끼기에 사용하지 않았다. 그래도 가상환경을 사용하지 않고 새로운 패키지를 까는 것을 죄악이니 꼭 conda는 사용하길 바란다.

 

0. tensorflow 2.6 설치

혹시 설치하지 않은 경우...

pip install tensorflow==2.6

1. NVIDIA GPU driver 설치

자기 그래픽 카드에 맞게 최신으로 설치.

https://www.nvidia.com/download/index.aspx?lang=en-us 

 

Download Drivers | NVIDIA

 

www.nvidia.com

 

2. CUDA Toolkit 11.4 Update 1 (11.4.1) 설치

https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

콘솔에서 커맨드 실행전에 sudo 명령어를 사용하는 다른 명령을 사용해두는 것이 좋다.

안그러면 첫줄만 돌아가고 root password를 묻는 통에 둘째 라인부터 실행이 되지 않는다.

 

Ubuntu 18.04

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

Ubuntu 20.04

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

3-1. cuDNN v8.2.2 for CUDA 11.4 다운

아래 사이트에서 cuDNN Library for Linux (x86_64)를 다운받으면 된다.

 

원래 Debian Package (dpkg)를 사용해서 설치하는 것이 제일 간단한데 이게 왜인지 실행이 제대로 되지 않는다.

 

혹시 시도를 해보려면 아래 링크에서 cuDNN Runtime Library for Ubuntu18.04 x86_64 (Deb)를 받으면 된다.

 

Ubuntu 20.04인 경우 해당 버전에 맞는 것을 받자. Developer 버전을 받지 않아도 된다.

 

아래 설치는 dpkg가 아닌 library를 통째로 받은 것을 전제로 진행할 것이다.

 

https://developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

developer.nvidia.com

3-2. cuDNN v8.2.2 for CUDA 11.4 설치

https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

 

Installation Guide :: NVIDIA Deep Learning cuDNN Documentation

The NVIDIA® CUDA® Deep Neural Network library™ (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalizati

docs.nvidia.com

위 링크에서 자세한 설치 방법을 알 수 있으나, 아래에 간략히 요약하겠다.

 

받은 파일은  .tgz 확장자로 tar.gz 파일이다. 내장 파일탐색기 nautilus로도 압축을 풀 수 있고, 터미널에서 tar -xzvf 다운받은파일명 으로 풀 수 있다.

 

내장 파일탐색기로 푸는 것이 쉬우니 그 방법을 추천한다.

 

tar 명령어로 푸는 방법은 아래와 같다.

더보기
tar -xzvf cudnn-11.4-linux-x64-v8.2.2.26.tgz

참고로, xzvf는 extract, gzip, verbosely list files processed, file 의 약자다.

 

다음으로 라이브러리를 CUDA Toolkit이 찾을 수 있는 장소에 넣어주어야 한다.

 

일반적으로 이는 /usr/local/cuda 폴더이며, 앞서 CUDA Toolkit을 설치하면 자동으로 생성되었을 것이다.

 

일단 터미널을 열고 압축을 풀어서 나온 cuda 폴더가 보이는 위치까지 간 뒤 아래 명령을 실행한다. 두 번째 명령이 파일이 많아서 시간이 조금 걸린다.

 

sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64 
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

4. 설치 종합

tensorflow v2.6 : tensorflow

CUDA Toolkit v 11.4.1 : CUDA 그 자체이다.

cuDNN v8.2.2 : library로 tensorflow 사용시 dynamic library 문제가 발생했다고 하면 이 친구가 문제인 것.

 

꼭 CUDA Toolkit은 cuDNN보다 먼저 설치해야 한다.

5. 확인

python에서 아래 코드로 GPU 사용을 확인해보자.

 

import tensorflow as tf

if tf.config.list_physical_devices('GPU'):
    print('TF is using GPU')
else:
    print('TF is NOT using GPU')

 

실행시 Information, Warning, Error로 로그가 나오는데, E만 없어도 대체로 정상작동하더라.

 

꼭 GPU로 돌아가는지 확인을 해보고 실행을 하자!

 

 

 

감사는 댓글이나 커피로 표현해주시면 감사히 받겠습니다.

paypal.me/knowblesse

 

 

 

Posted by Knowblesse

어느 날부터 웹캠이 흑백으로 나온다면 아래의 방법을 시도해보자.

 

Microsoft 공식 홈페이지를 포함해서 대부분의 Solution들이 드라이버 업데이트/재설치, 윈도우 업데이트/재설치를 이야기 하는데 정말 간단한 문제일 수 있다.

 

1. 카메라 고급 옵션 접근

먼저 Skype를 실행한다. 언젠가부터 Microsoft가 Microsoft Teams랑 Skype를 쥐도 새도 모르게 깔아놓던데 아주 마음에 안든다. Skype가 깔려있지 않다면 찾아서 설치하자. 카메라 고급 옵션에 접근하는 다른 방법도 있을텐데 (video stream을 사용하는 다른 소프트웨어도 가능하지 않을까? OBS Studio 라던가) 이게 가장 간단하다.

 

추가 메뉴에서 설정.
오디오 및 비디오에서 웹캠 설정

 

2. 카메라 고급 옵션 기본값으로 초기화.

전부 기본값으로 변경

 

Skype 뿐만 아니라 Zoom, Kakao Talk 등 웹캠 스트리밍이 가능한 소프트웨어에서 사용자가 직접 옵션 변경을 했거나, 낮은 조도 때문에 임의로 채도 혹은 낮은 빛 보상 옵션이 변경이 되면 흑백으로 나타나는 현상이 발생한다.

 

문제는 대다수의 소프트웨어들이 이러한 옵션을 display 해주지 않으며, 심지어 기준이 되어 Microsoft 기본 카메라 앱에 이 옵션에 대한 접근이 불가능 하다. (이게 주 원인인것 같다. 마소 놈들....) 심지어 한번 설정한 옵션은 카메라 모듈 내부에 따로 저장이 되는지 OS 재설치를 진행해도 흑백으로 나오는 현상이 발생한다.

 

삼성 노트북 A/S 후기

기술 발전과 정체로 노트북 브랜드간 격차가 사라져서 큰 차이가 없으면 국산 브랜드를 애용하자는 마음으로 현 노트북으로 삼성을 골랐다. 16Gb RAM과 외장 그래픽이 같이 딸린 200만원이 넘는 노트북 9을 구입했었는데 이게 몇 시간 Unity 기반 2D 게임을 돌렸다가 블루스크린과 함께 GPU가 저세상으로 갔다. 적어도 CPU에는 온도가 너무 높아지면 성능을 임의로 저하시켜서 칩을 보호하는 기능이 있는 것으로 아는데 이 제품의 GPU에는 이것을 제대로 구현하지 않은 것인가. 강제로 오버클럭을 시키거나 Fan이 고장났거나, 온도관련 안전장치를 해제 했으면 모르겠는데 정상 사용중 GPU가 고온으로 손상되다니 이것은 명백한 설계 미스다. 심지어 사이즈를 줄이기 위해서 CPU, RAM, GPU를 한 보드 위에 몰아두어서 GPU가 나갔다고 GPU만 고칠 수 없다더라. 수리비 90만원.

 

그나마 삼성에서 리퍼 부품 교환 서비스를 운영하고 있어서 절반 가격인 40만원 정도에 수리를 받았으나 제품 블랙리스트를 고려할만큼 많은 실망을 안겨주었다. A/S 기사님도 되도록 새 제품을 사는 것을 권장하셨으나 구매가를 생각하면 나쁘지 않은 선택이었다고 생각한다.

 

센터에 간 김에 위의 웹캠이 흑백으로 나오는 문제를 같이 문의했었다. 나는 소프트웨어 문제라고 계속 주장을 했으나 A/S 기사님이 자체 카메라 검사 유틸리티를 실행해서 확인을 했는데 진단은 카메라 모듈 하드웨어 손상. 카메라가 아예 안나왔으면 안나왔지 이런 현상을 본적이 없다고 하시더라. 카메라 모듈 역시 디스플레이와 일체형이라 수리비 20만원. 얜 포기를 하고 GPU 만 수리를 받았는데 오늘에야 문제를 자체적으로 해결했다.

 

노트북 제품들간 차이가 줄어든 현재, 사용자 경험의 사소한 차이가 구매로 이어진다. 수리가 어려운 구조의 제품 디자인과 GPU 보조 장치/프로그램의 설계 미스, A/S 프로토콜이 짚어내지 못한 너무나도 단순한 문제 때문에 앞으로 다른 브랜드 노트북에 눈이 가게 될 것 같다.

Posted by Knowblesse