728x90

CNI란?

CNI(Container Network Interface)는 컨테이너 네트워킹을 위한 표준 인터페이스를 정의하는 프로젝트

CNI는 컨테이너 네트워크 인터페이스를 쉽게 확장하고 맞춤화할 수 있게 해주며, 다양한 네트워킹 솔루션과 통합 가능함

CNI는 표준일 뿐, 특정 서비스에 적용하기 위해서는 인터페이스를 구체화하여 서비스에 맞춰 적용해야 함

이를 위해 컨테이너 관리 시스템에서 네트워킹 구성 및 관리를 위한 플러그인 기반의 다양한 프레임워크가 있음

kubernetes Network Plugin (CNI plugin)

네트워크 모델은 각 노드의 컨테이너 런타임에 의해 구현됨

가장 일반적인 컨테이너 런타임은 컨테이너 네트워크 인터페이스(CNI) 플러그인을 사용하여 네트워크 및 보안 기능을 관리함

Network Plugin을 사용하는 가장 큰 이유는 기본제공되는 kubenet 만으로는 서로 다른 노드에 있는 pod의 교차 네트워킹을 지원하지 않기 때문

CNI 플러그인을 설치하면, Kubenet은 사용되지 않음

Calico와 Kubenet 비교

  calico kubenet
네트워크 설정 • Calico는 네트워크 설정을 관리하며, 각 파드에 고유한 IP 주소를 할당함
• IP-in-IP, BGP(Border Gateway Protocol) 등을 사용하여 네트워크를 구성하고, 노드 간 트래픽을 라우팅함
◦ Kubenet은 기본적인 네트워크 설정을 제공하며, 각 파드에 고유한 IP 주소를 할당함
◦ 브리지 네트워크(cbr0)와 veth 페어를 사용하여 파드 간 통신을 설정함

네트워크 정책 • Calico는 강력한 네트워크 정책을 지원하여, 파드 간 및 파드와 외부 간의 트래픽을 세밀하게 제어할 수 있음
• 보안 그룹과 네트워크 정책을 통해 트래픽을 허용하거나 차단함
◦ Kubenet은 기본적인 네트워크 정책만 제공하며, 세밀한 트래픽 제어나 고급 보안 기능을 지원하지 않음
네트워크 기능 • Calico는 고급 네트워크 기능을 제공하며, 대규모 클러스터 환경에서도 높은 성능과 확장성을 보장함
• 네트워크 격리, 암호화, 모니터링 등의 기능을 제공함
◦ Kubenet은 간단한 네트워크 설정과 관리가 가능하지만, 대규모 클러스터 환경에서는 확장성과 성능 면에서 제한적임
728x90
728x90

 

Go 언어에서 함수와 메서드는 코드 구조화와 재사용성에 중요한 역할을 함

Go 언어에서 함수와 메서드는 각각의 용도와 목적이 다름

독립 함수는 새로운 인스턴스를 생성하는 데 주로 사용되며, 인스턴스 메서드는 기존 인스턴스를 수정하거나 조작하는 데 사용됨

독립 함수 (Standalone Function)

  • 정의: 특정 구조체에 속하지 않는 독립적인 함수
  • 용도: 주로 새로운 인스턴스를 생성하고 반환하는 역할을 함
package main

import "fmt"

type Config struct {
    Port int
}

type Server struct {
    config Config
}

// 독립 함수: 새로운 Server 인스턴스를 생성하고 반환
func NewServer(config Config) *Server {
    return &Server{
        config: config,
    }
}

func main() {
    config := Config{Port: 8080}
    server := NewServer(config)
    fmt.Println("Server running on port:", server.config.Port)
}

인스턴스 메서드 (Instance Method)

  • 정의: 특정 구조체의 인스턴스로 호출되는 메서드
  • 용도: 주로 기존 인스턴스를 수정하거나, 해당 인스턴스와 관련된 동작을 수행함
package main

import "fmt"

type Config struct {
    Port int
}

type Server struct {
    config Config
}

// 인스턴스 메서드: 기존 Server 인스턴스를 수정하고 반환
func (server *Server) NewServer(config Config) *Server {
    server.config = config
    return server
}

func main() {
    server := &Server{}
    config := Config{Port: 8080}
    server = server.NewServer(config)
    fmt.Println("Server running on port:", server.config.Port)
}

주요 차이점

  • 소속:
    • 독립 함수: 구조체와 독립적으로 정의됨
    • 인스턴스 메서드: 특정 구조체의 리시버를 가짐
  • 역할:
    • 독립 함수: 새로운 인스턴스를 생성
    • 인스턴스 메서드: 기존 인스턴스를 수정하거나 동작 수행
  • 리시버 사용:
    • 독립 함수: 리시버 없음
    • 인스턴스 메서드: 리시버를 통해 호출됨
728x90
728x90

인공지능 기술은 매 순간 빠르게 발전하고 있으며, 그 중심에는 언어 모델의 혁신이 자리잡고 있음

OpenAI의 최신 언어 모델인 ChatGPT-4는 기존의 ChatGPT-3 모델을 개선하여 여러 분야에서 더욱 향상된 성능을 보여주고 있음

이번 포스트에서는 ChatGPT-3와 ChatGPT-4의 주요 차이점을 살펴보고, 각각의 모델이 어떻게 사용자 경험을 변화시키고 있는지 정리함

모델 크기와 학습 데이터

ChatGPT-4는 ChatGPT-3보다 훨씬 큰 모델 크기를 가지고 있음

그리고 더 많은 데이터로 훈련되었기 때문에, 광범위한 지식을 바탕으로 다양한 주제에 대해 더 정확하고 상세한 정보를 제공함

문맥 이해와 일관성

ChatGPT-4는 문맥을 파악하고 유지하는 능력이 탁월함

복잡한 대화 흐름 속에서도 일관된 답변을 제공함으로써 사용자와의 대화가 더 자연스럽고 의미 있는 방향으로 이어질 수 있음

이는 기술적인 지원 또는 긴 설명이 필요한 상황에서 특히 유용함

다양한 언어에 대한 지원

다양한 언어 처리 능력은 ChatGPT-4의 또 다른 강점임

다국어를 더 효과적으로 처리할 수 있어, 영어가 아닌 다른 언어로 대화하는 사용자들에게도 높은 만족도를 제공함

창의적인 작업과 세부 처리

ChatGPT-4는 창의력을 필요로 하는 작업에서 더욱 뛰어난 성능을 발휘함

예를 들어 시나리오 작성, 시 쓰기 등의 창의적인 작업이나 복잡한 기술적 문제 해결에 있어서도 보다 세련되고 정교한 대응이 가능함

오류 인식과 처리

잘못된 정보의 인지와 수정 능력이 강화된 ChatGPT-4는 오류를 더 잘 파악하고 정정할 수 있음

이는 사용자가 더 신뢰할 수 있는 정보를 얻을 수 있게 하며, 오해의 소지가 있는 질문에 대해서는 사용자에게 추가적인 질문을 통해 정확한 답변을 도출해낼 수 있음

728x90

'AI > AI 트렌드' 카테고리의 다른 글

개발 / AI 기술 사이트  (0) 2024.06.19
728x90

프롬프트 엔지니어링(Prompt Engineering)은 인공지능(AI) 및 자연어 처리(NLP) 분야에서 사용자가 원하는 결과를 얻기 위해 모델에 제공하는 입력(prompt)을 설계하는 과정

이 과정은 특히 대형 언어 모델(LLM)에서 중요한 역할을 함

프롬프트란?

프롬프트(prompt)는 인공지능(AI) 및 자연어 처리(NLP) 시스템에서 모델에게 제공되는 입력 데이터를 의미함

모델이 수행할 작업의 맥락을 제공하고 원하는 결과를 얻기 위해 주어지는 명령어 / 질문 / 문장

프롬프트는 대화형 AI, 언어 모델, 챗봇 등 다양한 애플리케이션에서 사용됨

프롬프트 엔지니어링이란?

프롬프트 엔지니어링은 특정한 목표를 달성하기 위해 AI 모델에 주어지는 텍스트 입력을 최적화하는 기술

사용자가 원하는 답변을 얻기 위해 입력 문장을 어떻게 구성할지, 어떤 정보를 포함시킬지 등을 고민하는 과정

왜 프롬프트 엔지니어링이 중요한가?

  • 모델의 효율성 극대화: 적절한 프롬프트는 모델의 성능을 극대화하고, 더 정확하고 관련성 높은 결과를 얻을 수 있게 함
  • 사용자 경험 개선: 잘 설계된 프롬프트는 사용자가 AI와의 상호작용에서 더 만족스러운 경험을 얻을 수 있도록 도와줌
  • 시간과 비용 절감: 최적화된 프롬프트는 불필요한 반복 시도를 줄이고, 더 빠르게 원하는 결과를 얻을 수 있게 함
  • 문제 해결 능력 향상: 복잡한 문제나 질문에 대해 더 정교한 답변을 얻을 수 있어 다양한 비즈니스 및 연구 분야에서 유용함

프롬프트 엔지니어링의 기법

  • 명확하고 구체적인 질문: 모호한 질문보다는 명확하고 구체적인 질문을 통해 모델이 보다 정확한 답변을 제공하도록 유도함
    • 예: "기후 변화의 원인"보다는 "기후 변화의 주요 원인 세 가지를 설명하라"고 질문
  • 콘텍스트 제공: 필요한 배경 정보를 제공하여 모델이 더 나은 맥락 이해를 할 수 있게 함
    • 예: "프로메테우스 신화" 대신 "그리스 신화에서 프로메테우스가 인간에게 어떤 선물을 주었는지 설명하라"고 질문
  • 구조화된 형식 사용: 목록, 표 등 구조화된 형식을 통해 명확한 정보를 제공
    • 예: "자동차의 장단점을 나열하라"보다는 "자동차의 장점과 단점을 각각 세 가지씩 나열하라"는 식으로 구체화
  • 다양한 접근법 테스트: 동일한 질문을 여러 방식으로 제시하여 가장 효과적인 프롬프트를 찾음
    • 예: "파리 여행 가이드" 대신 "파리에서 방문할 만한 명소와 맛집 추천"과 같은 구체적 요청 시도

프롬프트 엔지니어링의 사례

  • 고객 지원: 챗봇이 고객의 질문에 정확하게 답변할 수 있도록 프롬프트 설계
  • 교육: 학생들이 AI 튜터로부터 유용한 학습 정보를 얻을 수 있도록 효과적인 질문을 작성
  • 연구: 연구자들이 AI를 활용해 특정 주제에 대한 심도 있는 정보를 얻기 위한 프롬프트 작성

결론

프롬프트 엔지니어링은 AI 및 NLP 분야에서 매우 중요한 역할을 하며, 효과적인 프롬프트 설계를 통해 모델의 성능을 극대화하고 사용자 경험을 향상시킬 수 있음

이는 다양한 산업과 분야에서 적용 가능하며, 지속적인 연구와 실험을 통해 더 나은 방법을 찾아나가는 것이 필요함

728x90

'AI > LLM' 카테고리의 다른 글

LLM이란?  (0) 2024.06.19
728x90

LLM(대형 언어 모델, Large Language Model)은 자연어 처리(NLP)와 인공지능(AI) 분야에서 사용되는 컴퓨터 모델

이 모델은 대규모 텍스트 데이터를 기반으로 학습되어 인간의 언어를 이해하고 생성할 수 있는 능력을 가짐

LLM의 대표적인 예로는 OpenAI의 GPT-4, Google's BERT, Facebook의 RoBERTa 등이 있음

 

LLM의 주요 특징

  1. 대규모 학습 데이터: LLM은 수십억 개의 문서와 문장을 포함하는 대규모 텍스트 데이터를 사용해 학습함. 이를 통해 다양한 주제와 맥락에서 언어를 이해하고 생성할 수 있게 됨.
  2. 언어 이해 및 생성 능력: LLM은 질문에 대한 답변, 텍스트 요약, 번역, 글쓰기 보조 등 다양한 자연어 처리 작업을 수행할 수 있음. 이는 LLM이 문맥을 이해하고 적절한 언어 출력을 생성할 수 있기 때문임.
  3. 전이 학습(Transfer Learning): LLM은 특정 작업에 맞게 미세 조정(Fine-tuning)될 수 있음. 즉, 일반적인 언어 모델로서 학습된 후, 특정 도메인이나 작업에 맞게 추가 학습을 통해 성능을 향상할 수 있음.
  4. 연속성과 일관성: LLM은 긴 텍스트 내에서 문맥을 유지하고 일관된 답변을 제공할 수 있음. 이는 모델이 텍스트의 구조와 패턴을 잘 학습했기 때문임.

LLM은 다양한 산업과 분야에서 활용될 수 있음

예를 들어, 고객 서비스에서 자동 응답 시스템, 콘텐츠 생성, 의료 분야에서 환자의 질문에 대한 답변 제공, 법률 자문 등 다양한 응용 사례가 있음

LLM은 인간과 컴퓨터 간의 상호작용을 더욱 자연스럽고 효율적으로 만드는 데 중요한 역할을 하고 있음

728x90

'AI > LLM' 카테고리의 다른 글

프롬프트 엔지니어링이란?  (1) 2024.06.19
728x90

superb-ai MLOps 뉴스레터

 

MLOps Insight 뉴스레터 구독하기

슈퍼브에이아이 - MLOps 뉴스레터 구독하기 슈퍼브에이아이가 엄선한 글로벌 MLOps 소식과 인사이트, 슈퍼브에이아이 플랫폼 업데이트를 가장 빠르게 받아보세요!

info.superb-ai.com

 

https://news.hada.io/

 

GeekNews - 개발/기술/스타트업 뉴스 서비스

개발 뉴스, 기술 관련 새소식, 스타트업 정보와 노하우, 세상의 재미난 것들을 좋아하는 사람들을 위한 뉴스 사이트. 이메일 뉴스레터/트위터/슬랙 봇으로 구독 가능

news.hada.io

 

https://www.aitimes.com/

 

AI타임스

AI타임스(aitimes.com)는 인공지능 중심의 전문 미디어입니다.

www.aitimes.com

 

https://devocean.sk.com/blog/index.do

 

데보션 (DEVOCEAN) 기술 블로그 & 커뮤니티

데보션 (DEVOCEAN) 기술 블로그 , 개발자 커뮤니티이자 내/외부 소통과 성장 플랫폼

devocean.sk.com

 

https://medium.com/

 

Medium – Where good ideas find you.

Medium is an open platform where readers find dynamic thinking, and where expert and undiscovered voices can share their writing on any topic.

medium.com

 

https://brunch.co.kr/@sicle-official/35

 

개발 실력을 위한 IT기업 기술 블로그 45곳 모음

2020.08 업데이트 | 최근 국비교육, 부트캠프 등의 교육을 수강하고 개발자로 커리어를 전환하신 비전공자분들을 쉽게 볼 수 있습니다. 기술이 더욱 빠르게 발전하며, 개발 직군은 지속적인 학습

brunch.co.kr

 

728x90

'AI > AI 트렌드' 카테고리의 다른 글

ChatGPT-3와 ChatGPT-4, 무엇이 달라졌을까?  (0) 2024.06.20
728x90

구조체

여러 필드를 하나로 묶어 새로운 타입을 정의할 수 있는 방법 (ex: 개 > 이름, 나이, ...)

메서드

특정 타입에 속한 함수 (개 > 짖기, ...)

메서드를 정의하면 해당 타입의 인스턴스에서 호출할 수 있음

인터페이스

메서드 시그니처의 집합으로, 어떤 타입이 특정 인터페이스를 구현하려면 그 인터페이스에 정의된 모든 메서드를 구현해야 함

(인터페이스 : 동물 > 짖기 => 구조체 : 강아지 > 짖기, 고양이 > 짖기)

예시

package main

import "fmt"

// 인터페이스 정의
type Animal interface {
    Speak() string
}

// Dog 구조체 정의
type Dog struct {
    Name string
    Age int
}

// Dog에 Speak 메서드 구현
func (d Dog) Speak() string {
    return "Woof!"
}

// Cat 구조체 정의
type Cat struct {
    Name string
}

// Cat에 Speak 메서드 구현
func (c Cat) Speak() string {
    return "Meow!"
}

func main() {
    // Animal 인터페이스 타입의 슬라이스 생성
    animals := []Animal{
        Dog{Name: "Rex", Age: 5},
        Cat{Name: "Whiskers"},
    }

    // 각 동물의 Speak 메서드 호출
    for _, animal := range animals {
        fmt.Println(animal.Speak())
    }
}

 

 

 

728x90

'Go' 카테고리의 다른 글

Go 구조체 메서드의 값 리시버와 포인터 리시버  (1) 2024.09.13
Go 함수와 메서드 차이  (0) 2024.06.24
728x90
# 로컬 브랜치 목록 확인
git branch

# 로컬 브랜치 삭제
git branch -D 브랜치명

# 원격 저장소에서 지워진 브랜치 삭제
git fetch --all --prune

 

728x90
728x90

도커(Docker)를 사용하여 애플리케이션을 컨테이너화할 때, 컨테이너 내부에서 환경변수를 설정하는 것은 매우 중요함

환경변수를 통해 애플리케이션의 설정값을 동적으로 관리할 수 있으며, 이는 배포 및 운영 환경에서 매우 유용함

도커 컨테이너 내부에서 환경변수를 설정하는 여러 가지 방법이 있음

 

도커 컨테이너 실행 시점에 환경변수 설정하는 방법

1. docker run 명령어에 -e 옵션 사용

docker run -e MY_VAR=some_value my_image

 

2. docker run 명령어에 --env-file 옵션 사용

# .env 파일 예시
MY_VAR1=some_value1
MY_VAR2=some_value2
docker run --env-file .env my_image

 

도커 이미지 생성 시 환경변수 설정하는 방법

1. 도커파일에 ENV 지시어 사용

# Dockerfile 예시
FROM python:3.8-slim

ENV MY_VAR=some_value

 

2. 도커컴포즈 파일에서 환경변수 설정

# 환경변수 직접 설정
version: '3.8'
services:
  my_service:
    image: my_image
    environment:
      - MY_VAR=some_value
# .env 파일 사용
version: '3.8'
services:
  my_service:
    image: my_image
    env_file:
      - .env

 

3. 컨테이너 내부에서 스크립트를 사용하여 설정

# start.sh 예시
#!/bin/bash
export MY_VAR=some_value
exec "$@"
# Dockerfile 예시
FROM python:3.8-slim

COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]
CMD ["python", "app.py"]

exec "$@"에서 "$@"는 스크립트에 전달된 모든 인수를 의미함

위의 도커이미지로 도커컨테이너 실행 시 "docker run my_image python app.py" 라는 명령어를 수행했다면, 

exec "$@"exec python app.py 로 대체되어 동작함

 

4. 자주 변경되는 환경변수 도커파일 변경 없이 설정하는 방법

--build-arg를 활용하면 빌드 시점에 변수로 값을 주입할 수 있음

하지만 이는 빌드 과정에서만 사용되고 도커이미지 내에 환경변수로는 등록되지 않기 때문에, ENV 지시어를 사용해 도커이미지 환경변수로 등록해줘야 함

# Dockerfile 예시
FROM python:3.8-slim

# 빌드 시점 변수 받기
ARG MY_VAR

# 런타임 환경 변수로 등록
ENV MY_VAR=${MY_VAR}

RUN echo "MY_VAR is $MY_VAR"
docker build --build-arg MY_VAR=some_value -t my_image .

 

728x90
728x90

prometheus_client 라이브러리는 Prometheus와 함께 사용할 수 있는 클라이언트 라이브러리로, 애플리케이션의 메트릭을 수집하고 노출하는 데 사용됨

이 라이브러리를 통해 다양한 유형의 메트릭을 생성하고 관리할 수 있음

이 라이브러리에서 메트릭 수집을 위하여 주로 사용되는 Counter, Gauge, Histogram 클래스에 대해 알아봄

Counter

Counter는 단조 증가하는 메트릭을 나타냄

주로 이벤트의 발생 횟수를 측정하는 데 사용됨

한 번 증가하면 줄어들지 않음

from prometheus_client import Counter

# Counter 메트릭 생성
requests_total = Counter('requests_total', 'Total number of requests')

# 메트릭 증가
requests_total.inc()  # 1 증가
requests_total.inc(5)  # 5 증가

Gauge

Gauge는 값이 증가하거나 감소할 수 있는 메트릭을 나타냄

현재 온도, 메모리 사용량 등과 같이 상태를 나타내는 데 사용됨

from prometheus_client import Gauge

# Gauge 메트릭 생성
temperature = Gauge('temperature', 'Current temperature')

# 메트릭 설정 및 변경
temperature.set(25.3)  # 값 설정
temperature.inc()      # 1 증가
temperature.dec(2.3)   # 2.3 감소

Histogram

Histogram은 값의 분포를 관찰하는 데 사용됨

요청 시간, 응답 크기 등의 분포를 측정하는 데 유용함

from prometheus_client import Histogram

# Histogram 메트릭 생성
request_latency = Histogram('request_latency_seconds', 'Request latency')

# 메트릭 관찰
request_latency.observe(0.5)  # 0.5초의 지연 시간 관찰
request_latency.observe(1.2)  # 1.2초의 지연 시간 관찰

종합 예제

Counter, Gauge, Histogram을 사용하여 간단한 웹 애플리케이션에서 메트릭을 수집하고 노출하는 예제

 
from prometheus_client import Counter, Gauge, Histogram, start_http_server
import time
import random

# 메트릭 정의
REQUESTS = Counter('requests_total', 'Total number of requests')
TEMPERATURE = Gauge('temperature', 'Current temperature')
LATENCY = Histogram('request_latency_seconds', 'Request latency')

# 메트릭 수집 및 노출 시작
start_http_server(8000)

while True:
    # Counter 증가
    REQUESTS.inc()

    # Gauge 설정
    TEMPERATURE.set(random.uniform(20.0, 30.0))

    # Histogram 관찰
    latency = random.uniform(0.1, 1.0)
    LATENCY.observe(latency)

    # 대기 시간
    time.sleep(1)

결론

  • Counter: 단조 증가 메트릭
  • Gauge: 값이 증가하거나 감소할 수 있는 메트릭
  • Histogram: 값의 분포를 관찰하는 메트릭

이러한 구성 요소를 사용하여 애플리케이션의 다양한 성능 지표를 수집하고 Prometheus 서버에 노출할 수 있음

728x90

+ Recent posts