태그 보관물: 리눅스

wsl2 종료되지 않게 하기 – Prevent wsl2 from exiting

wsl2를 실행해두고 간이 linux 서버로 쓰려는 목적으로 mini pc에 실행을 해두었지만 wsl2가 며칠 이내에 반드시 자동으로 종료되는 문제가 있었습니다. 그래서 여러가지 설청 방법을 찾아서 wsl2를 항상 켜두는 방법을 전에 올린 적이 있었습니다. 그런데 그 방법은 결과적으로 작동하지 않는다는 것을 알았습니다.

예전보다 실행되어 있는 시간이 길어 조금 오래 버티기는 하지만 wsl2를 실행하고 열어둔 “터미널(terminal)” 이나 “파워쉘(powershell)”까지 종료 시키면서 확실하게 종료됩니다.

아마도 윈도우에서 실향된지 오랜된 wsl을 강제로 종료하도록 확실해게 처리한 것 같습니다. 특히 “명령 프롬프트”나 “파워쉘”을 통해서 실행한 것은 wsl뿐만 아니라 “명령 프롬프트”와 “파워쉘”까지 모두 종료됩니다.

그래서 다른 방법으로 C#으로 wsl2가 죽었는지 학인해서 되살리는 애플리케이션을 간단하게 돌려서 실행했더니 3주 이상 잘 작동하고 있습니다.

간단한 것이지만 소스는 github에 있으니 필요하면 참고하세요.

https://github.com/euriion/wsl-reviver

ImportError: cannot import name ‘_psutil_linux’ from partially initialized module ‘psutil’

다음과 같은 에러가 주피터 랩(Jupyter lab)에서 나는 경우가 있습니다.

ImportError: cannot import name ‘_psutil_linux’ from partially initialized module ‘psutil’

패키지 설치가 조금 꼬인 경우입니다.

다음과 같이 패키지를 설치해서 해결할 수 있습니다.

python -m pip install --ignore-installed psutil

MAB (Multi Armed Bandit) – 광고 플랫폼의 캠페인 노출 최적화

MAB는 기계학습 강화학습의 일종입니다. 완전한 강화학습은 아니지만 포함해서 취급합니다.

MAB는 “엠에이비”, “멀리암드밴딧”이라고 발음합니다.

“팔 여러 개 달린 산적” “Multi Armed Bandit”은 슬롯머신의 별명인데 이 알고리즘은 이름처럼 “어떤 슬롯 머신의 팔을 당겨야 돈을 딸 수 있는가?” 와 같은 문제를 풀기위한 방법입니다.

엄밀한 의미의 강화학습에 포함되지 않지만 상당히 간단하고 쓸만하고 강화학습의 개념을 익히기 좋기 때문에 강화학습을 설명할 때 가장 먼저 설명하는 것이기도 합니다.

여러 대의 슬롯 머신이 있고 이 슬롯 머신 중 어떤 것의 레버를 당겨야 돈을 딸 수 있는가를 푸는 문제입니다. 한 번에 1대의 슬롯머신의 레버를 당기고 계속해서 반복합니다.

이 문제의 전제 조건이 있는데 한 번에 하나의 슬롯머신의 팔을 당길 수 있다는 것입니다.

그래서 동시에 모든 슬롯머신의 팔을 당겨서 그리고 여러번 당겨서 어떤 슬롯머신이 돈을 딸 학률이 높은지 알아낼 수 없습니다.

그래서 한 번에 하나씩만 선택해서 돈을 최대한 많이 따는 것이 이 문제의 푸는 목적입니다.

복잡한 공식은 여기에 안 적겠습니다. 구글에서 찾아보시면 수식과 코드가 다 있습니다.

첫번째 방법. Greedy 욕심쟁이

모든 슬롯머신에 순차적으로 한 번씩 팔을 내려봅니다. 그래서 돈을 못땄다면 다시 한 번씩 다 팔을 내려봅니다.

몇번을 수행한 후에 딴 돈이 가장 많은 슬롯머신에게 계속해서 몰빵합니다.

이게 그리디(Greedy, 탐욕스러운) 방식입니다. 단순하면서도 조금 무식한 방법입니다.

두번째 방법. epsilon

Greedy 방법을 사용하되 무작정 사용하지 않고 랜덤으로 팔을 당길 확률을 정해놓습니다.

만약 50%의 확률로 랜덤을 고르겠다고 하면 한 번은 지금까지 가장 돈을 많이 딴 슬롯머신을 당기고 한 번은 랜덤으로 아무것이나 고르는 방법입니다.

그나마 다른 것들에게 기회를 준다는 것 때문에 낫습니다.

epsilon이라는 이름은 랜덤으로 고를 확률값을 epsilon이라고 이름을 붙여서 부르기 때문입니다.

세번째 방법. UCB(Upper-Confidence-Bound)

위의 epsilon에서 약간의 공식을 주어서 랜덤 찬스가 왔을 때 무조건 랜덤으로 어떤 슬롯머신을 팔을 다기지 않고 덜 뽑혔던 슬롯머신에 가중치를 두어서 더 뽑아서 팔을 내려줍니다.

네번째 방법. Tompson sampling

톰슨 샘플링은 설명을 하면 조금 복잡해지는데 확률 분포 중 하나인 베타분포를 이용해서 확률이 가장 높은 것을 선택하는 것입니다.

베타분포 함수에 선택된 횟수와 돈을 딴 횟수를 입력하면 베타분포를 각각 구할 수 있고 그 베타분포를 확률 분포로 이용해서 값을 구하면 선택할 것을 찾을 수 있습니다.

저장된 데이터를 이용할 수 있는 장점이 있고 UCB 보다 성능이 조금 더 좋아서 온라인 추천 시스템에서 많이 이용되고 있습니다.

A/B 테스트와 MAB의 관계

A/B 테스트는 통계학의 실험계획법 중 하나 인데 2개 또는 2개 이상의 그룹을 동일한 수(최대한 비슷한 수) 만큼 각각 분할해서 한쪽에만 다른 처리를 해서 두 그룹의 차이를 보는 방법입니다

온라인에서는 흔히 버킷테스트라고 하는 방법입니다.

예를 들어 광고배너가 있는데 원래 배너는 테두리가 하얀색인데 테두리를 빨간색으로 바꿨을 때 사람들이 어떤 것을 클릭을 더 많이 하는지 알아 보고 싶을 때 같은 경우에 합니다.

A/B 테스트가 오랫동안 사용한 방법이기 때문에 잘 알려져 있지만 문제는 두 그룹을 방해받지 않게 불한하는 방법이 상당히 어렵고 두 그룹의 차이를 알아보는 방법이 데이터의 양상과 원래 데이터의 특성에 따라 여러가지 통계적인 방법을 써야하는 데 실수로 잘못된 방법으로 확인을 했다고 하더라도 그 실수를 알아내기 어렵다는 문제가 있습니다.

A/B 테스트를 하는 것은 많이 어렵지 않지만 A/B테스트의 결과를 해석하는 것은 매우 숙련된 통계학자가 필요하고 시간도 많이 걸립니다.

그래서 A/B 테스트를 하지 않고 각각 반응을 그대로 볼 수 있는 어떤 환경이 있다면 그 환경에서는 각각 매번의 결과에 따라서 결과가 좋은 것에 점수를 더 줘서 그것을 선택하게 만드는 방법을 쓰자는 것입니다.

그래서 MAB는 온라인 시스템의 추천시스템이나 평가에 굉장히 적합합니다.

광고시스템과 MAB

한 번에 5개의 제품을 동시에 보여지는 광고 이미지가 있다고 가정합니다.

사용자 별, 또는 사용자 그룹별로 어떤 제품에 더 관심을 가지는 지를 보고 클릭을 많이 하는 제품을 MAB에 의해서 더 많이 노출한다고 하겠습니다.

흔히 쓰는 방법이지만 이게 문제가 좀 있습니다.

  • 선택할 제품이 매우 많은 경우에는 못합니다. 아마도 제품의 카테고리가 있고 그것들 중에 가장 잘 팔리는가 하는 전략을 취할 수 있지만 상식적으로 좋은 방법은 아닐 것입니다.
  • 선호도는 계절성 효과, 요일 효과, 캠페인에 피로도에 따라 달라집니다. 슬롯머신 처럼 확률이 안변한다는 가정을 두기가 좀 어렵습니다. 변동이 너무 많습니다.
  • 또 가중치를 변경하는 것 때문에 생기는 문제가 파생적으로 생기는데
    • 쿠키로 인해 신규 및 재이용자의 분포에 영향을 미칩니다.
    • 변화에 대한 적응이 느리기 때문에 인해 관성때문에 결과가 왜곡될 수 있습니다.

아주 단순한 경우에만 사용이 가능하며 복잡한 시스템으은 오히려 결과를 왜곡할 수 있습니다.

저렇게 선택한 것이 여전히 가장 좋은 방법 또는 그리 좋은 선택이 아닐 수도 있겠지만 그 자체를 확실하게 확인 못합니다. 이건 다른 알고리즘도 동일한 문제이긴 합니다만.

E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution).

우분투에서 패키지를 설치하다가 의존성이 깨지거나 하게 되면 그 뒤로 apt를 실행할 때 마다 에러가 발생합니다. 여간해서는 해결이 잘 안되는데요.

E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

이렇게 하면 됩니다.

sudo apt-get -o Dpkg::Options::="--force-overwrite" install --fix-broken

출처: https://askubuntu.com/questions/1044817/failed-installation-of-package-breaks-apt-get

리눅스에서 한글 파일 정렬이 안될 때 – Sorting Korean text file on Linux

다음과 같은 파일이 있습니다.

파일이름은 test.txt입니다.

1       홍길동
2       전우치
4       변학도
3       이몽룡
5       성춘향

이렇게 하면 2번째 커럼으로 소팅이 되야 합니다.

sort -k 2 test.txt


그런데 이렇게 해도 소팅이 안되고 순서가 정렬이 안되는 경우가 있습니다.

LC_COLLATE나 LC_ALL 환경변수에 한글을 지정해 줘야 합니다.

$ export LC_COLLATE="ko_KR.utf8"
# 또는
$ export LC_ALL="ko_KR.utf8"

위의 명령으로 리눅스 환경의 언어셋을 변경하면 소팅이 되는데 에러 메세지가 나올 수 있습니다.

-bash: warning: setlocale: LC_COLLATE: cannot change locale (ko_KR.utf8): No such file or directory

이 에러가 나오는 것은 언어패이 설치가 되어 있지 않기 때문입니다. 그럴 때는 이렇게 해줍니다.

# CentOs나 Redhat 리눅스 계열
$ sudo apt install language-pack-ko

# Ubuntu 우분투 계열
$ sudo yum install glibc-langpack-ko

그 뒤에 다시 sort 코맨드로 정렬을 해보면 잘 됩니다.

$ sort -k 2 1.txt

4       변학도
5       성춘향
3       이몽룡
2       전우치
1       홍길동