Category: Python

  • 냉장고 감시 시스템

    과에서 사용하는 냉장고 온도를 실시간으로 감시하고 싶었다. 이유는 다음과 같다.

    현장 실사에서 이런 시스템을 같추고 있는 기관들을 봤다. 상당히 멋져 보였다.

    그런데 디지털 감시 시스템 기록은 유건평에서는 인정하지 않는다. 수작업으로 확인을 해야만 인정하고 있다. 그렇다면 인정하게 하려면 어떻게 해야할까? 그래서 직접 운영해 보기로 했다.

    작업 비용을 최소화하고 싶었다. 그래서 선택한 것이 Pico 이다. 예전에는 Wi-Fi가 지원이 안되었다. 그런데 이 작업 시작하면서 다시 확인해보니 Wi-Fi가 지원되는 제품들이 있었다. 처음에는 이전에 구입한 모듈을 이용하기 위해서 ESP8266으로 데이터 통신을 했었다. 기본 코딩 방법을 익힌 다음 이 것들은 집 베란다에서 온도를 측정하는 목적으로 이용하고 있다.

    DS18B20 모듈은 측정하고자 하는 온도 범위가 지원된다. 사진에 보이는 것처럼 길다른 측정선이 있는 제품도 있고, 간단한 모듈 형태로만 있는 제품도 있다. Pico를 냉장고에 넣을 수 없을 것이라고 생각했었다. 나중에 알고 봤더니 냉장고라면 사용 가능한 온도다. 그래도 위 제품을 이용한 것은 전원 콘센트부터 측정 부위까지 거리를 늘릴 수 있기 때문이다. 그리고 글리세린에 넣어야 할 수도 있는 것을 고려했다.

    5mm 클램프를 구입하면 probe 쪽은 약하지만 고정할 수 있다. 검정 피복의 외경이 4mm 정도였다. 고무테이프를 이용해서 유격을 없앴다. 클램프가 있어야 온도 probe를 일정한 위치에 고정할 수 있다.

    간헐적으로 연결이 끊어지는 경우가 있다. 하지만 내 목적에 영향을 미치지 않는다.

    적어도 보름 정도 운영해 봤다. 안정성은 충분한 것으로 보인다. 다음 발표까지 보다 장기간 운영을 할 것이다.

  • cur.close()

    집 서버는 대략 1일 1회 정도 재부팅한다. 처음에는 오전 9시 15분에 아내와 딸의 휴대전화가 연결되어 있지 않으면 재부팅 과정이 실행되도록 했다. 방학이 되니 적용할 수 없었다. 그래서 방학 때도 적용할 수 있는 코드를 새로 작성했다. 이 과정에서 재부팅 직전에 날짜와 시간을 db 파일에 저장해 둔다. 실행은 잘 되는데 로그를 보면 다음과 같이 cursor가 제대로 닫히지 않는다고 한다.

    cur.close()
    sqlite3.ProgrammingError: Cannot operate on a closed database.

    여러 방법을 시도한 끝에 with를 이용해서 connection을 생성하는 방법을 적용했더니 더 이상 해당 메세지가 로그에 찍히지 않는다.

    with sqlite3.connect(~~~, isolation_level=None) as con:
        cur = con.cursor()
        cur.execute(~~~)
        cur.close()

  • datetime on matplotlib

    • datetime 형식의 자료도 matplotlib에서 잘 그려진다.
    • datetime 형식의 자료를 이용한다면 보통 x축에 그린다.
    • 추가로 더 그리고 싶은 자료가 있을 경우 같은 위치에 그리기 위해서는 정확한 좌표를 알아야 한다.
    • matplotlib.dates.date2num() 을 이용하면 datetime 형식에 해당하는 x 축 좌표를 실수 형태로 얻을 수 있다.
  • Chamfer distance, CPU or GPU

    여러 객체 각의 chamfer distance를 구하는 중이다. CPU로 구하는 방법도 있고, GPU로 구하는 방법도 있다.

    적어도 내가 사용하는 범위 내에서는 CPU로 하는 것이 좋다.

    • GPU로 할 경우 계산 속도가 일정하지 않다. 상당히 편차가 크다. 빠른 것은 CPU보다 훨씬 빠르고 느린 것은 훨씬 느리다. 5500을 사용하는 입장에서 6배 정도의 속도 향상을 기대해야 한다. 정말 이건 애매하다.
    • GPU 여러 개를 가지고 있지 않은 이상 동시에 여러 계산을 진행할 수 없다. 속도 향상 여지가 적은 편이다.
    • 3070으로는 간혹 메모리 부족 오류가 생겨 계산 자체가 진행이 안된다. 수 만 번 진행해야 하는데 프로그램이 종료되는 오류는 피해야 한다. 메모리가 큰 3090 같은 것을 이용한다면 큰 문제가 없을 것 같다.
    • CPU를 사용해야 하는 작업을 동시에 진행하는 경우라면 GPU로 진행해도 괜찮다.

    위에 내용은 지난 번에 남긴 것이다. 다시 시도해보니 GPU다 더 빨랐다. 그것도 충분히 말이다. 그래서 다시 정리했다.

    • GPU로 계산할 때 계산 시간이 다르게 보였던 것은 GPU 계산 전에 있는 preprocessing 과정에 걸리는 시간이 모두 달랐기 때문이다. 사전에 preprocessing을 한 파일을 만들어 둔 상태에서 다시 계산하니 상당히 빨랐다. CPU로만 chamfer를 구현하면 3일 정도 걸렸다. GPU로 Hausdorff와 같이 계산해도 7-8시간 걸린 것 같다. 이것도 CPU로 일부 계산한 증례를 포함한 것이다.
    • 3070의 8GB VRAM의 한계가 아쉽다. 우선 float32를 사용하면 OOM를 쉽게 접한다. float16으로 계산하면 OOM 빈도가 줄어든다. 이럴 경우만 CPU를 이용하도록 했다. 몇몇 OOM 인 경우를 봤더니 상당히 체격이 길쭉했다. 즉, vertices가 많으면 OOM이 생길 가능성이 높다. 상당히 말이다.