반응형

최근 커뮤니티에서 Ollama 라는 로컬에 LLM 을 쉽게 번들링 해주는 도구를 알게 되서, 호기심에 설치해봤다. 

 

쉽게 얘기해서 ChatGPT 와 같은 언어 모델을 내 컴퓨터에 로컬로 설치해서 사용하는 것이다.

 

장점이라고 한다면 오프라인으로 오픈소스 LLM(대규모 언어 모델)을 무료로 사용할 수 있고, 데이터 유출이 되지 않기 때문에 보안성이 높을 것이다. 

단점은 뭐 상용 모델보다는 답변의 퀄리티, 속도, 최신화된 정보의 답변을 받을 수 없다는 것들이 있을 수 있겠다.

 

ollama 를 설치하는 것만으로도 LLM 을 사용할 수 있다. 하지만 나는 웹 기반의 UI 가 익숙하므로 오픈 소스 open-webui 를 이용해 설치해봤다.

 

ollama 는 여기 https://github.com/ollama/ollama open-webui 는 여기에 자세한 가이드가 나와있다.

https://github.com/open-webui/open-webui

 

GitHub - open-webui/open-webui: User-friendly WebUI for LLMs (Formerly Ollama WebUI)

User-friendly WebUI for LLMs (Formerly Ollama WebUI) - open-webui/open-webui

github.com

 

관심있어 하는 분들이 있을 것 같아, 퀵스타트 구축을 포스팅해보겠다.

 

 

1. 사전 준비

  • Docker 가 설치된 환경
  • Mac , Linux 기반 환경

2. Set Up 


# set dir for volume mount
mkdir data
mkdir open-webui

# image pull and docker run
docker run -d -p 3000:8080 -v data:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama

실행 과정
컨테이너가 실행을 확인

 

http://localhost:3000 접속

 

3. Model Import

모델 추가 및 다운로딩 과정

 

여러 특징에 맞게 학습된 모델들이 있을 것이다. 목적에 맞게 모델을 선택하면 되고, 중요한 것은 컴퓨터 사양이 받쳐줘야 한다. ( 내 경우에는 일부 모델이 실행되지 않았다.. 노트북 사고 싶다.. ) 

 

4. Test

간단하게 버블 정렬을 구현한 파이썬 코드를 보여달라고 해봤다.

 

배치 크기나 토큰 크기도 조절이 가능하다.

 

 

5.마무리

오픈 소스다 보니 사용자들이 학습한 모델을 올릴 수 있고, 공유할 수 가 있다. 컴퓨터 사양이 좋거나 GPU 가 있으면, 이미지 생성도 가능하다. 

 

https://openwebui.com/#open-webui-community

 

 

오늘은 여기까지.. 

 

끝.

 

 

 

 

 
 
반응형
반응형

1. 프로메테우스(prometheus) 란?

SoundCloud 사에서 만든 오픈 소스 기반 모니터링 솔루션

  • 많은 도큐먼트와 커뮤니티 보유

go 언어로 만들어짐

하드웨어 레벨 / 애플리케이션 모니터링이 가능

  • 마이크로 서비스
  • multiple language 지원(java, go, 등)
  • window/linux

pull 방식 아키텍쳐

  • push 방식은 패킷 손실. 수집처 서버의 CPU 사용율. 그리고 단일장애의 위험성이 있음
  • pull 방식은 tcp/udp 오버헤드가 적고, 집계가 push 보다 쉬워짐.
  • 부하가 높은 상황에서는 fail point 를 비교적 예방 할 수 있음

하지만 단점도? 

  • 수집 메트릭과 룰이 많아질수록 configuration 이 복잡해짐
  • 단일 노드 동작으로 스케일 아웃이 어려움

2. 왜 프로메테우스?

다양한 써드파티 Exporter 가 있다.

시계열 데이터 모델

PromQL 이라는 쉽고 간결한 자체 쿼리 언어 지원

단일 노드 사용하여 수집

많은 회사에서 사용하고 있고, kubernetes 에서도 prometheus 사용을 장려하고 있다.

3.프로메테우스 구조

시스템 구성도

prometheus server

  • main component
    • http 서버 : PromQL 쿼리를 받음
    • 시계열 데이터 베이스 storage : metric 저장
    • Worker : metric 반환

Exporter

  • fetch metric, convert to correct format, expose metric
  • 다양한 종류의 익스포터 지원
    • 해당 노드에서 발생하는 HW 메트릭 정보 수집

AlertManager

  • 알림이 발생하는 Rule 을 정의해서 부합하는 경우 알림 전송

Jobs

  • Single Application
  • 모니터 대상

** 역시 Pull Mechanism 이 가장 큰 특징 !!!

  • Data Retrieval Worker 가 pushgateway, prometheus targets으로 pull을 한다. 푸시가 아니라 pull 방식으로 수집한다.

동작 방식을 간단히 요약하면..

  • Jobs / Exporters 는 실제 메트릭을 수집하는 프로세스, 에이전트
  • Prometheus Server 가 Pull 방식으로 데이터를 가져갈 수 있게 HTTP 엔드포인트를 제공
  • GET 방식 요청을 날려 메트릭 정보를 수집하고, TSDB 에 저장.

4. 프로메테우스 설치 (docker-compose)

how? (구성 방법)

  • 아래 방법은 prod 수준이 아닌 빠른 구성이며, 모든 설정은 기본 값으로 되있다.
  • docker, docker-compose 가 미리 설치되어 있어야 한다.

a) 프로메테우스 구성

  • 가장 기본적인 구성은 프로메테우스 서버, 그라파나 조합이다.
  • 아래는 수집툴 node-exporter도 같이 띄워주는 설정이다
version: '3.7'

volumes:
    prometheus_data: {}
    grafana_data: {}

networks:
  front-tier:
  back-tier:
    driver: bridge

services:

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus/:/etc/prometheus/
      - ./prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - 9090:9090
    links:
      - cadvisor:cadvisor
      - alertmanager:alertmanager
    depends_on:
      - cadvisor

    networks:
      - back-tier
      - front-tier
    restart: always

  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command: 
      - '--path.procfs=/host/proc' 
      - '--path.sysfs=/host/sys'
      - --collector.filesystem.ignored-mount-points
      - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
    ports:
      - 9100:9100
    networks:
      - back-tier
    restart: always
    deploy:
      mode: global

  alertmanager:
    image: prom/alertmanager
    ports:
      - 9093:9093
    volumes:
      - ./alertmanager/:/etc/alertmanager/
    networks:
      - back-tier
    restart: always
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
      
    grafana:
    image: grafana/grafana
    user: "472"
    depends_on:
      - prometheus
    ports:
      - 3000:3000
    volumes:
      - ./grafana_data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    env_file:
      - ./grafana/config.monitoring
    networks:
      - back-tier
      - front-tier
    restart: always

b) process-exporter

  • 일반적으로 node-exporter 로 h/w 정보를 수집하긴하지만, 프로세스 수준으로 데이터를 수집이 필요할때 사용하면 좋다.
  • https://github.com/ncabatoff/process-exporter/releases/tag/v0.7.10
  • release 버전에 맞게 받을 수 있음
  • cofnig 설정방법
    • cat /proc/[processid]/cmline 의 정규식에 걸리는 애들
    process_names:
      - name: "{{.Comm}}"
        cmdline:
        - '.+'
  • 위 process-exporter 구성은 선택사항이다. 필요에 따라 구성해도 좋다. 

c) prometheus.yml 설정

  • 수집 서버 설정과, 방식, 룰 들을 셋팅하는 설정 파일이다
# 기본적인 전역 설정 
global:
  scrape_interval:     15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
  # 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.
# Alertmanager 설정
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
  - job_name: 'prometheus'
    # 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
    # 'scheme'라는 설정의 기본 값은 'http'이다.
    static_configs:
    - targets: ['localhost:9090']
    
 - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']
  - job_name: 'process_exporter'
    static_configs:
      - targets: ['localhost:9256']
  • prometheus 설정파일과 볼륨 마운팅 된 위치에 위 설정파일을 추가한다
  • 위 주석을 간단하게 달았지만, 수집 서버에 대한 정보가 scrape_configs 에 모두 기술되어야 한다
  • 모든 구성이 끝나면 docker-compsoe 명령을 이용해 컨테이너를 띄운다.

(구성된 이미지나 스크린샷들은.. 나중에 추가..)

 

 

5) 소감..?

  • 이번에 회사에서 프로메테우스 신규 구성을 맡아 진행해봤는데, 역시 공부할게 아직도 많다. 
  • 그라파나에서 완성된 대시보드를 import 하면 수집쪽 셋팅 후 정말 손쉽게 구성할 수 있다.
  • 데이터 엔지니어에게 있어 모니터링은 정말 중요한 작업이라는걸 다시 느꼈다. 

 

반응형
반응형

1.zeppelin 기반 로컬 개발 환경 구성이란?

spark 를 공부할 때, zeppelin 이라는 노트북을 이용하면 편하다.

python 에서 주피터와 비슷한 역할의 툴이다.

spark 개발을 안한지 오래되서, 다시 공부를 하기 위해 구성해보려고 한다.

요즘 데이터 엔지니어들이 보는 코딩 테스트에는 알고리즘 문제 뿐만 아니라, 스파크를 이용한 문제도 출제 된다.

역시 docker-compose 를 이용해서 구성한다.

 

2.왜 Docker-compose ?

오픈 소스 버전을 그대로 로컬에 받아서 설치하려면, 적지 않은 시간이 소요된다.(java 설치 lib 등등의 환경 설정. 네트워크 설정 이나 연동 등 .. )

누군가 고생해서 만들어 놓은 docker image 와 docker-compose 에 설정이 기술된 yaml 파일을 이용하여 손쉽게 올릴 수 있다. (보통 docker compose [오픈 소스 이름] 을 치면 쉽게 찾을 수 있다. )

 

3. zeppelin, spark 설치 

구성해보기보다는 따라하기에 가깝다. 내가 참고한 블로그를 참조 한다. 여기를 참고하는게 더 정확하니까 아래 링크로 이동하자.

https://omrisk.medium.com/apache-spark-3-playground-back-to-school-with-zeppelin-notebooks-pt-3-4ebc18da68f7

 

Apache Spark 3 playground — Back to school with Zeppelin notebooks! Pt.3

In this third and final part of our “Apache Spark 3 playground” guide we will be adding a Zeppelin notebook into the mix.

omrisk.medium.com

a) 설치 스크립트

# git clone 다운로드
$ https://omrisk.medium.com/apache-spark-3-playground-back-to-school-with-zeppelin-notebooks-pt-3-4ebc18da68f7

# 컨테이너 올리기
$ docker-compose -f docker-compose.yml -f docker-compose-zeppelin.yml up -d

 

b) 브라우저 접속

  • http://localhost:9090 접속, (zeppelin) 
  • 마찬가지로 spark mster GUI 에도 접근이 가능하다.
  • 기본적으로 예제 코드와 스파크 앱을 띄우는 노트가 있다. ( spark server 입장에서는 zeppelin 도 하나의 appication 이기 때문에 spark 를 사용하기 위해서는 인터프리터가 구동되어야 한다.) 

** 보통 zeppelin 과 spark 를 연동 할때 spark_home ,master 엔드포인트를 잡아주는데, 아래에서 처럼 노트 안에서 잡아줄수도 있는 것 같다. 

 

 

시간이 생기면 추가로 보충하겠다... 너무 바쁘다 요즘.

반응형
반응형

1.apache superset 이란?

비지니스 인텔리젼스 웹 애플리케이션다.

에어비엔비에서 사용하고 있는 시각화 툴이다.

 

 

2. 왜 superset ?

오픈소스이면서 다양한 데이터소스를 지원한다.

UI 가 직관적이다.

에어비엔비가 쓰니까 공신력? 있어보인다.

 

3. spuerset 설치 (docker-compose)

how ? ( 구성 방법 )

a) 설치 스크립트

  • non-dev 버전으로 띄웠더니 app, worker, db, cache (redis) 프로세스가 분리되어있다.
    # yaml 소스 클론
    $ git clone https://github.com/apache/superset.git
    
    # 릴리즈 버전으로 체크아웃
    $ git checkout 1.2.0
    $ git status
    
    # 컨테이너로 올리는 명령 실행
    $ docker-compose -f docker-compose-non-dev.yml up -d​

b) 브라우저 접속

 

  • 초기 비밀번호는 admin/admin
  • http://localhost:8088 접속 (서버에 설치하신 분들은 localhost에 설치한 서버의 host 로 대체)
  • 기본적으로 예제 데이터가 추가되어있는데, yaml 을 찾아보면 off 할 수 있다.

 

 

c) 데이터소스 추가 ( mysql)

차트 또는 대시보드를 구성하기 전에, dataset 을 생성해야 한다.

CSV 등의 데이터 업로드를 위해서는 database advanced 에서 권한 을 줘야 한다.

대시보드 구성은 다음 편에 ..  :D

반응형
반응형

1.앤서블(Ansible) 이란?

  • python으로 개발됨
  • 환경설정, 배포를 가능하게 하는 툴
  • 깃허브 파이썬 랭킹중 상위.
  • 장점자동 배포 환경이 쉽다
  • 멱등성(여러번 적용해도 결과가 바뀌지 않음)
  • 빠른 ssh 통신. 빠른 provision이 가능

2.왜 앤서블(Ansible) ?

아직 실무에 앤서블을 적용해보기 전이고, 편리함, 이점이 피부로 와닿지는 않지만, 아래의 상황에서 좋을 것 같다

-> 작업자가 서버 셋팅을 반복적으로 해야 하거나,다수의 서버에 클러스터로 동일한 설정을 해줘야 할 경우

 

2.앤서블 설치

pip 을 통해 설치가 가능하다

$pip install ansible

3. 앤서블 사용하기

a) Inventory 설정

  • 타겟이 되는 host(managed node)들에 대한 메타정보를 기술한 파일이다. -> 쉽게 말하면 내가 어떤 서버들에 작업을 할건지, 서버 
  • 호스트마다 변수를 지정할 수 있으며 호스트 변수라고 한다
  • yaml , ini 포맷으로 작성해야 한다
  • ansible을 설치경로에 ansible.cfg 설정파일을 통해 mannual 하게 경로를 줄 수 있다

ansible.cfg

[defaults]
inventory=/home/jssvs/work/ansible_inventory

 

hosts

[airflow_worker]
airflow-worker-01  --> 이 부분은 /etc/hosts 에 등록되어 있으면 호스트명을 쓰면 된다.
airflow-worker-02

[airflow_scheduler]
localhost

 

ansible에 등록된 host 간 네트워크 통신이 되는지 ping 으로 체크 방법

$ ansible all -m ping

 

b)Playbook 작성

  • 등록된 호스트에 뭘 하게 할건지를 기술하는 파일이다. 워크플로우 작업들을 작성하면 된다.
  • 룰커맨드 실행/ 스크립트 실행 / 인스톨 패키지 등등을 정의할 수 있음특수문자( - ) 으로 플레이 단위를 구분한다.탭을 쓰면 안된당
  • 시작은 —-로 한다.
  • command, script, yum, service 등의 모듈을 지원한다.
  • 호스트에서 동작할 task 활동을 정의
  • yml 작성후 웹에서 yaml lint 사이트를 이용하여 들여쓰기를 정리하면 편하다.
  • http://www.yamllint.com
 

YAMLlint - The YAML Validator

YAML Lint Paste in your YAML and click "Go" - we'll tell you if it's valid or not, and give you a nice clean UTF-8 version of it. Optimized for Ruby.

www.yamllint.com

Playbook1.yml

#Simple PlayBook1.yml
---
-
	name : play1
	hosts : localhost
	tasks :
		- name : Execute command 'date'
			command : date
		
		- name : Execute run script
			script: test_script.sh

		- name : test2
      shell: "echo 'helloworld' >> /home/deploy/ansible_print.log


-
	name : play2
	hosts : airflow_worker01
	tasks : 
		- name : Install Yum package
			yum : 
				name: httpd
				state : present
		- name : Run httpd server
			service :
				name : httpd
				state : started

c) Playbook 실행

$ansible-playbook <playbook-filename>
반응형
반응형

1.도커 인스톨

#Docker install
$ sudo yum install docker-ce docker-ce-cli containerd.io

 

 

2.도커 자주 사용하는 명령어들

  • 이미지 확인
    • $docker images
  • 이미지 가져오기
    • $docker pull [이미지이름]:[태그]
  • 컨테이너 생성하기
    • $ docker create -i -t centos:
    • docker create [옵션] [이미지 이름] :[태그]
  • 컨테이너 실행하기
    • 컨테이너 실행하기에는 생성하기 과정도 포함되어 있다.
    • $ docker run -i -t 이미지:태그
    • $ docker run -i -t ubuntu:14.04
    • 옵션
      • -d 데몬 백그라운드 실행
      • -p 포트, [연결할 호스트의 포트] : [컨테이너의 포트]
      • —name [컨테이너 이름]
      • -i : interactive 하게 사용하겠다는 의미
      • -t : tty를 사용하겠다는 의미.
      • volume :
      • --volume /testdata:/test
      • OS 의 testdata 디렉토리와 컨테이너의 test 디렉토리를 공유
      • centos의 경우 권한 관련 에러를 뱉을 수 있으므로 run 시 privileged 옵션을 넣어준다.
  • 컨테이너 내버 쉘로 들어가기
    • $ docker attach lentos:7
    • $docker exec -it [컨테이너] /bin/bash
  • 컨테이너 목록 확인
    • $ docker ps
  • 컨테이너 삭제
    • $ docker rm [컨테이너 이름]
  • 이미지 삭제
    • $ docker rmi
  • 도커의 컨테이너를 외부에서 접근 할 수 있도록 IP와 포트 바인딩
    • $ docker run -p 3306:3306 -p [아이피]:[포트] [컨테이너 이름]

 

반응형
반응형

1. 레디스(Redis) 란?

  • Redis = Re(remote) + di(Dictionary) + s (Server )
  • 메모리를 사용하는 db
  • NoSQL, Replication, Master/Slave 구조로 구성이 가능하다.
  • K/V 형태로 데이터 저장.
  • 파일 싱크를 제공
  • 다양한 데이터 타입 제공
  • NoSQL 이기 때문에 Table, db, function, row, column 이 존재 하지 않는다
  • 데이터 Interaction 이 Command 를 통해서 이뤄진다.

2. 왜 레디스?

  • Simple , Flexible
  • Durable
  • 깃헙, 스냅챗, 트위터, 스택오버플로우 등 다양한 서비스에서 사용중

 

3. Redis 성능 관련

  • 100만개의 키들을 저장할때 70MB 정도 공간이 소모 된다.
  • 100만개 - 70 MB. 1억개 - 약 7GB,
  • HashType은 매우 효과적으로 인코딩된 사전구조로 되어 있어, Redis 코어 개발자중 한명인 Pieter Noordhuis가 추천함
  • HashType 을 이용하여 버킷으로 저장 하는경우 100만 키 - 16MB
  • 데이터를 durable 할 수 있게 파일에 쓰는 옵션이 다양한데, 안전한 옵션일 수록 redis의 속도를 느리게 한다.

 

4. 레디스  구성 ( on Docker)

#네트워크 생성
$sudo docker network create redis-net

#레디스 서버 
$sudo docker run --name my-redis --network redis-net -p 6379:6379 -v /home/deploy/redis_data:/data -d redis:alpine redis-server --appendonly yes


$sudo docker run --name my-redis --network redis-net \
-p 6379:6379 \
-v /Users/jssvs/WorkSpace/docker/redis_data:/data \
-v /Users/jssvs/WorkSpace/docker/redis_data/redis.conf:/usr/local/etc/redis/redis.conf \
-d redis:alpine redis-server /usr/local/etc/redis/redis.conf


#레디스 CLI
$sudo docker run -it --network redis-net --rm redis:alpine redis-cli -h my-redis

sudo docker run -it --rm redis:alpine redis-cli -h my-redis
$vi redis.conf
requirepass 1111  


# redis. conf
#인증 패스워드 설정
requirepass 1111

#스냅샷 파일 저장 디렉토리 경로 설정
dir /data

#스냅샷 db 파일 이름 설정
dbfilename dump.rdb

#AOF 설정 (Append-Only File) OS 레벨에서 맛탱이 갔을 때를 대비해 
appendonly yes

# 60초마다 1000번 이상 데이터 변경 시 저장
save 60 1

 

 

5. 레디스 Client 커맨드 (기본)

인증
>AUTH 1111[PASS]

키 가져오기
>GET [keyname]

키 넣기
>set [keyname] [data]

키 삭제
>del [keyname]

키 스페이스 정보
>info keyspace

키 삭제(플러시)
> flushall
> flushall async

 

6. 레디스 hashset 예제 코드 ( python )

from redis import StrictRedis

r=StrictRedis(host='localhost',password='1111')

user = {"name":"jayden", "Company":"home", "Address":"Suwon","score":60}

r.hmset("jayden", user)

r.hgetall("jayden")
반응형

+ Recent posts