서문
이 블로그는 발전 과정을 기록했으며 참고 가치가 부족합니다. 아래 프로젝트를 직접 확인하고 docker를 사용하여 빠르게 배포하는 것을 권장합니다.
결과 이미지:
| 라이트 | 다크 |
|---|---|
![]() | ![]() |
이전 방안: ssh로 nvidia-smi 출력 가져오기
이전 프론트엔드 경험은 Python으로 html을 생성하는 수준에 머물러 있었기 때문에, 제 작은 호스트를 사용하여 GPU 모니터링 방안을 구성했습니다:
- ssh 명령어로 nvidia-smi의 출력을 가져와서 비디오 메모리 사용량 등의 정보를 파싱합니다.
- GPU를 점유하는 프로세스의 pid를 기반으로 ps 명령어로 사용자와 명령어를 가져옵니다.
- Python을 사용하여 위 정보를 markdown으로 출력하고, Markdown을 통해 html로 출력합니다.
- cron을 설정하여 매 분마다 위 단계를 실행하고, nginx에서 웹 루트를 html이 있는 디렉토리로 설정합니다.
해당 코드는 다음과 같습니다:
이 방안에는 몇 가지 명백한 단점이 있습니다. 갱신 빈도가 낮고, 백엔드 갱신에 전적으로 의존하여 누군가 접속하든 말든 계속 데이터를 새로고침해야 합니다.
새로운 방안: 프론트엔드와 백엔드 분리
사실 계속 프론트엔드와 백엔드가 분리된 GPU 모니터링을 구현하고 싶었습니다. 각 서버에서 fastapi를 실행하여 요청이 있을 때 필요한 데이터를 반환하는 방식입니다. 최근 개발한 南哪充电 덕분에 API에서 데이터를 가져와 페이지에 렌더링하는 프론트엔드를 개발할 자신감이 생겼습니다.
fastapi 백엔드
최근 우연히 nvitop이 Python 호출을 지원한다는 것을 발견했습니다. 원래는 명령어로만 데이터를 시각화할 수 있다고 생각했었거든요.
좋습니다, 이제 필요한 데이터를 더 편리하게 가져올 수 있고 코드 양이 크게 줄었습니다! ( •̀ ω •́ )✧
하지만 번거로운 문제는 우리 연구실 서버가 라우터 아래에 있고, 라우터는 제 통제 하에 있지 않아 포트가 ssh만 포워딩되어 있다는 점입니다.
여기서 저는 frp를 사용하여 각 서버의 API 포트를 교내 작은 호스트로 매핑하기로 했습니다. 마침 제 작은 호스트에 여러 웹 서비스를 구성해 두어서 도메인으로 API에 접근하기도 편리합니다.
이전에 바보 같았네요. 사실 ssh(ssh -fN -L 8000:localhost:8000 user@ip)로 포트 매핑을 할 수 있습니다. 이렇게 하면 코드에서 frp 관련 내용을 삭제하고 docker로 웹 측을 시작하는 것도 더 쉬워집니다.
코드에는 3개의 환경 변수가 있습니다:
SUBURL: API 경로를 구성하는 데 사용됩니다. 예를 들어 서버 이름 등으로 지정합니다.FRP_PATH: frp 및 그 설정이 있는 경로로, API가 있는 포트를 교내 작은 호스트로 매핑하는 데 사용됩니다. 만약 여러분의 서버에 직접 접근할 수 있다면 관련 함수를 삭제하고 마지막 줄을0.0.0.0으로 변경한 후 IP(또는 각 서버에 별도로 도메인을 설정)를 통해 접근하면 됩니다.PORT: API가 있는 포트입니다.
여기서는 두 개의 인터페이스만 작성했습니다 , 실제로는 하나만 사용했습니다
/count: GPU 개수를 반환합니다./status: 구체적인 상태 정보를 반환하며, 반환 데이터는 아래 예시를 참조하세요. 다만 여기서는 두 개의 선택적 매개변수를 추가로 작성했습니다:idx: 쉼표로 구분된 숫자로, 지정된 GPU의 상태를 얻을 수 있습니다.process: 반환되는 프로세스를 필터링하는 데 사용됩니다. 저는 사용 시 C로 설정하여 계산 작업만 표시합니다.
vue로 구현한 프론트엔드
여기서는 잠시 게으름을 피웠습니다 , 사실은 할 줄 몰라서, 일단 원래 Python으로 생성한 UI를 그대로 베꼈습니다.
npm run build로 무사히 릴리스 파일을 얻고, nginx의 root를 해당 폴더로 설정하면 완성입니다.
구현된 결과: https://nvtop.njucite.cn/
UI는 여전히 못생겼지만, 적어도 동적으로 새로고침할 수 있게 되었습니다. 야호!
새로운 UI
일단 여기에 그림의 떡을 그려둡니다. 배워서 돌아오겠습니다. ( ̄_, ̄ )
더 아름다운 UI(이 점이 달성되었는지 저도 확실하지 않습니다. 저는 디자인 쓰레기입니다)
사용률 꺾은선 그래프 추가
야간 모드 지원
2024/12/27: nextjs를 사용하여 위의 TODO를 모두 완료했습니다. 또한 일부 호스트를 숨기는 기능을 구현하고, 숨긴 호스트를 쿠키로 설정하여 다음에 열 때 동일한 상태를 표시하도록 했습니다.
2025/03/11: nextjs에 이메일 로그인 기능을 업데이트하여 인증된 사용자만 접근할 수 있도록 했습니다.
2025/09/18: 코드를 정리하여 이제 기능이 기본적으로 완성되었고 다른 사람들이 직접 배포하기 편리해졌습니다.
전체 코드는 다음에서 확인하세요:

