어셈블리 기초 http://blog.naver.com/PostView.nhn?blogId=gangst11&logNo=145839687

캐시레지스터 http://jake.dothome.co.kr/cache2/

msr : 시스템 레지스터는 MSR, MRS 인스트럭션을 사용하여 접근할 수 있다.
 msr SPsel , #1 // 1을 stack pointer seletor에 1 값을 쓴다.
 . The Processor State, or PSTATE fields, for AArch64 have the following definitions:
   SP : Stack pointer selector, 0 = SP_EL0, 1 = SP_ELn
   (https://developer.arm.com/docs/100878/latest/processor-state)

 mrs : 레지스터에 값을 복사해주는 명령 
 mrs x0, CurrentEL // x0에 CurrentEL(Current Exception Level)을 읽어온다

CPSR : Current Program Status Register
  현재 프로그램 상태 레지스터
  연산결과를 저장하는 CPSR(Current Program Status Register)의 4개 필드

  • N (Negative) : 연산결과가 음수인 경우 1로 SET.
  • Z (Zero) : 연산결과가 0인 경우 1로 SET.
  • C (Carry) : 덧셈 연산의 Carry일 경우 1로 SET. 뺄셈 연산의 Borrow일 경우 0으로 Clear. rotation shift 연산에서는 shift되어 밀린 1 bit를 저장.
  • V (Overflow) : signed 연산의 덧셈, 뺼셈에서 연산 결과로 overflow가 발생한 경우 1로 SET

cmp : x0과 CurrendEL_EL2의 값 비교
 cmp x0, #CurrentEL_EL2 // CurrentEL_EL2의 값은 8
 
b.eq : branch on equal 약어. 같이 같으면 분기, condition 부분에 .eq(매크로일수도)
 b.eq 1f // f = forward, b = backward, 가까운 1: 으로 이동
 
mov_q : 64bit register에 상수를 즉시 move, operand bit가 한정되어있어서 인스트럭션 두개로 나눔
 mov_q x0, (SCTLR_EL1_RES1 | ENDIAN_SET_EL1)

- SCTLRThe System Control Register (SCTLR) is a register that controls standard memory, system facilities and provides status information for functions that are implemented in the core.
(https://developer.arm.com/docs/100878/latest/the-system-control-register)

- mov : 왼쪽에 있는 값을 오른쪽으로 복사한다.
mov w0, #BOOT_CPU_MODE_EL1

isb : Instruction Synchronization Barrier
 isb 명령이 동작하는 순간 파이프라인으로 인해 다음 명령이 뒤 따라 들어오게 되는데 이를 모두 버리게한다. 파이프라인 flush. 우선순위를 확실히 구분해야하는 루틴에서는 두 명령 사이에 isb를 실행시켜 두 명령어의 실행순서를 명확히 보장한다.

- adrpAddress of 4KB page at a PC-relative offset. PC에서부터 _PHYS_OFFSET(0x82000)을 더하여 x23에 저장
adrp x23, __PHYS_OFFSET

- adr_l : macro, adrp/add
adr_l x1, __boot_cpu_mode

- adrp : From PC-relative address to 4KB page. 페이지 시스템에서 사용하기위한?

ADR은 ARM 명령어가 아니라 PC의 상대 주소를 계산하여 주소값을 얻어오는 어셈블러 매크로입니다.
 adr r0, adr_test // r0 = adr_test 함수의 주소를 복사한다?

- str : 저장 명령어
str w0, [x1] : x1의 주소에 w0을 저장한다.
[Rm] = Rd. 메모리 주소에 레지스터 값을 저장합니다.

- ldr : 로드 명령어
 ldr r1, [r2, #16] : r2에 16byte만큼 더한 주소에서 정수형 값을 읽어와 r1에 저장한다.
 Rd = [Rm]. 해당 메모리 주소의 값을 레지스터에 저장합니다.

- dmbhttp://jake.dothome.co.kr/barriers/
dmb sy

- dc
dc ivac, x1

__create_page_tables : head.S line 287

- TTBR : Translation Table Base Register, 페이지 테이블 주소가 저장되는 레지스터

'개발' 카테고리의 다른 글

AArch64 generic timer  (0) 2019.12.09
plot graph color  (0) 2019.10.04
컴파일러  (0) 2019.01.08
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
AWS dynamodb  (0) 2018.09.04

https://www.youtube.com/watch?v=7vunJlqLZok

70년대부터 월가에서 시장의 가격 예측을 위한 예측 모델을 사용했다
금융 데이터 포인터 : 재무자료, 배당금, 세금, 주가
시간 분석으로 회귀 분석 해야한다
분류하는 여러 방법. 분류 문제/회귀
실무적회계/재무보고/배당조정/화해
금융 산업에서 인공지능 시장의 규모는 2017년 15조원에서 22년에는 80조원까지 오를 것으로 예상 -> 시장이 커진다!
인공지능이 핀테크 시장에 쓰이는 방법에 대한 지도 : 신용 평가, 밀레니얼 세대를 위한 개인융자, 금융 조언, 보안분야(오탐률, 사기로 분류된 거래 등 오분류, 비정상 금융거래탐지), 신용 대출, 자산관리, ...
회귀 모델은 수치형 데이터만 사용 가능하다
NLTK, Text blob 라이브러리로 문자로 감정/의미/생각 분석 가능, 좋다 나쁘다~~
분류 문제의 결과가 회귀 모델의 데이터로 들어갈 수도 (수치형)
LSTM : 주가 분석에 월등한 성능을 보이는 모델, 먼 미래까지 순차적으로 예측
강화 학습 : 시행착오를 통하여 학습

TF-Lite uses gemmlowp for matrix multiplication, which stores results of uint8 matrix products in int32. Then, we can add the biases quantized in higher precision as int32 itself. Finally, in going from 32-bit to 8-bit.

https://github.com/google/gemmlowp/blob/master/doc/quantization.md

 

google/gemmlowp

Low-precision matrix multiplication. Contribute to google/gemmlowp development by creating an account on GitHub.

github.com

https://github.com/google/gemmlowp/blob/master/doc/quantization_example.cc

  • Quantization as an affine map
    • quantized uint8 value와 real value의 매핑을 나타내면
    • ...더보기
      real_value = A * quantized_value + B              (1)

      real_value = C * (quantized_value + D)            (2)
  • zero-padding 등 구현의 이점을 위하여 real value 0에 대응하는 quantized value를 zero-point라 한다.
  • Quantizing a matrix multiplication
    • quantied value의 행렬곱 형태로 변경한다.
    • 2개의 real matrix가 있다고 하면 (lhs_real_matrix, rhs_real_matrix)
    • ...더보기
      lhs_real_value[i] = lhs_scale * (lhs_quantized_value[i] - lhs_zero_point)

      rhs_real_value[i] = rhs_scale * (rhs_quantized_value[i] - rhs_zero_point)
    • 행렬곱 결과인 result_real_value는
    • ...더보기
      result_real_value
           = Sum_over_i(lhs_real_value[i] * rhs_real_value[i])
           = Sum_over_i(
                  lhs_scale * (lhs_quantized_value[i] - lhs_zero_point) *
                  rhs_scale * (rhs_quantized_value[i] - rhs_zero_point) )
           = lhs_scale * rhs_scale * Sum_over_i(
                  (lhs_quantized_value[i] - lhs_zero_point) *
                  (rhs_quantized_value[i] - rhs_zero_point)
              )                                                                               (4)

Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

https://arxiv.org/pdf/1712.05877.pdf

 

2. Quantized Inference

2.1 Quantization scheme

  • q : quantized value
    • 8bit quantization에서
      • q is quantized as an 8-bit integer
      • Some arrays, typically bias vectors, are quantized as 32-bit integers
        • 32bit 쓰는 이유는 bias에서 오차가 생길 경우 패널티가 더 심하기 때문
  • r : real value
  • S : scale, 보통 floating point로 표현되고, 이를 피하는 방법이 2.2에 설명되어있다.
  • Z : zero-point, real value 0과 매칭되는 quantized value
    • zero-padding 등 효율적인 구현을 위해 필요하다.

2.2 Integer-arithmetic-only matrix multiplication

  • (1)번식에서 q를 어떻게 구할 것인가, S가 integer가 아닌데 어떻게 integer arithmetic으로 바꿀 것인가
  • NxN 행렬 r1, r2가 있다고 했을 때, 행렬곱 r3 = r1r2
  • rα (α = 1, 2 or 3) 라고 할 때, 위의 식에 대입하면, 행렬 각 각의 값은 아래와 같이 표현할 수 있다.

  • 행렬곱 식으로 r3을 다시 써보면,

  • multiplier M은 아래가 되고, quantization scale 값으로만 구성된, 식에서 유일한 non-integer 값이다.

  • S1, S2, S3은 offline으로 계산될 수 있다. (?)
  • 경험적으로 이 값들은 (0, 1) 사이에 있고, 그러므로 정규형(normalized form)으로 표현할 수 있다.

  • M0은 [0.5, 1) 사이의 값이고, n은 non-negative integer(0을 포함한 자연수, 음이 아닌 정수)이다.
    • Half-Closed Interval, [은 include, )는 not inclued
  • normalized multiplier M0은 fixed-point multiplier로 표현되기 적합하고, 2^-n은 bit-shift로 구현될 수 있다.

2.3 Efficient handling of zero-points

  • 위의 식 (4)를 풀어쓰면

  • (8) 식은 그럼 N번 더하는 덧셈 계산만 있는거고, 둘 다해서 2N^2번 덧셈을 하게 되는 것이다.
  • 그럼 (7) 식은 아래 integer 행렬곱 누적 계산에 집중되어있다.

 

2.4 Implementation of a typical fuesd layer

  • 행렬곱에 bias-addition, activation function evaluation을 추가한 fused layer를 위해 (7) 식을 수정할것이다.
  • Inference code에서도 training 때 사용한 "fake quantization" operator와 동일하게 매치되어야한다.
  • q1 행렬은 weights, q2 행렬은 activation, 둘 다 uint8 타입을 가진다고 하면, 곱셈 결과 타입은 signed 32bit.
  • 왜냐하면 bias-vector가 int32로 quantization되었기 때문 (bias의 zero-point는 0으로 사용한다.)
  • (9) 식을 아래와 같이 나타낼 수 있다

  • 그 다음으로,
    1. scale down (8bit output activations을 위해)
    2. cast down (uint8로)
    3. apply the activation function (최종 8bit output 생성!)

3. Training with simulated quantization

3.1 Learning quantization ranges

  • For each layer, quantization is parameterized by the number of quantization levels and clamping range, and is performed by applying point-wise the quantization function q defined as follows:

  • 의미 : 
    • r : real value
    • [a; b] : quantization range
    • n : the number of quantization levels
    • ⌊·⌉ : rounding to the nearest integer
  • weight quantization과 activation quantization의 quantization range는 다르게 다루어진다.

 

 

[ 참고 ]

  1. normalization & standardization : https://m.blog.naver.com/PostView.nhn?blogId=zzing0907&logNo=220213633559&proxyReferer=https%3A%2F%2Fwww.google.com%2F
    1. normalization : 정규화, 데이터의 범주를 바꾸는 작업
    2. standardization : 표준화,  
  2. 8bit Inference with TensorRT : http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf

'개발 > Deep learning' 카테고리의 다른 글

RL & GA  (0) 2019.10.01
Stock Price Prediction | AI in Finance  (0) 2019.04.22
TF-Lite uses gemmlowp for matrix multiplication  (0) 2019.04.18
밑바닥 딥러닝_7장 합성곱 신경망(CNN)  (1) 2019.01.27

* 합성곱 신경망 Convolutional neural network, CNN *

- 이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 다 CNN을 기초로 함


7.1 전체 구조

- CNN도 이전 신경망과 같이 레고 블록처럼 계층을 조합하여 만들 수 있다

- 합성곱 계층 convolutional layer풀링 계층 pooling layer가 등장

- 기존의 신경망은 인접하는 계층의 모든 뉴런과 결합 = 완전연결 fully-connected 이라고하고, 완전히 연결된 계층을 Affine 계층이라는 이름으로 구현

   - 아래와 같이 Affine 계층 뒤에 활성화 함수를 갖는 ReLU(또는 sigmoid) 계층으로 이어짐

- CNN의 구조 : 합성공 계층과 풀링 계층이 추가됨

   - Conv-ReLU-(Pooling) 흐름, 풀링 계층은 생략되기도 함

   - 출력에 가까운 층에서는 Affine-ReLU 구성을 사용할 수 있음

   - 마지막 출력 계층에서는 Affine-Softmax 조합을 그대로 사용


7.2 합성곱 계층

7.2.1 완전연결 계층의 문제점

- 완전연결 계층에 입력할 때는 3차원 데이터를 평평한 1차원 데이터로 평탄화 -> 데이터의 형상 무시

   - MNIST 데이터셋 1 x 28 x 28  -> 1줄로 세운 784개 데이터를 입력으로..

- 완전연결 계층은 형상을 무시하고 모든 이력 데이터를 동등한 뉴런(같은 차원의 뉴런)으로 취급하여 형상에 담긴 정보를 살릴 수 없다.

- 합성곱 계층은 형상을 유지!!

   - CNN에서 합성곱 계층의 입출력 데이터를 특징맵(feature map) 이라고 한다

   - 입력 데이터를 입력 특징 맵(input feature map IFM)

   - 출력 데이터를 출력 특징 맵(output feature map OFM)

7.2.2 합성곱 연산 (이미지 처리에서 말하는 필터 연산)

- 합성곱 연산은 입력 데이터에 필터를 적용한다. (필터는 커널이라고도 한다.)

- 필터의 윈도우를 일정 간격으로 이동해가며 입력 데이터에 적용

- 입력과 필터에서 대응하는 원소끼리 곱한 후 그 총합을 구한다 = 단일 곱센-누산(fused multiply-add, FMA)

- 위의 예 : 15 = 1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 + 0*0 + 1*2

- 그 결과를 출력의 해당 장소에 저장, 이 과정을 모든 장소에서 수행하면 합성곱 연산의 출력 완성

- 완전연결 신경망에는 가중치 매개변수와 편향이 존재

- CNN에서는 필터의 매개변수가 그동안의 가중치에 해당, 편향도 존재함. 포함하면 아래와 같음

※ 합성곱 효과

- 필터는 그 특징이 데이타에 있는지 없는지를 검출

- 위의 곡선과 비슷한 특징들을 추출

7.2.3 패딩

- 합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(예컨대 0, zero padding)으로 채우기도 한다. = 패딩 padding

- 패딩의 목적 : 출력 크기 조정

   - (4, 4) 입력 데이터에 (3, 3) 필터를 적용하면 OFM은 (2, 2)가 된다 -> 합성곱을 거칠 때마다 크기가 작아져 어느 시점에서는 1이 될거다.

  - 이러한 사태를 막기위해, 입력 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수 있다.

7.2.4 스트라이드

- 필터를 적용하는 위치의 간격을 스트라이드(stride, 보폭)이라고 한다.

- 이전에 본 건 스트라이드 1

- 스트라이드를 키우면 출력 크기가 작아짐, 패딩을 크게하면 출력 크기가 커짐

- 이러한 관계에서 OFM 크기를 구하는 걸 수식화하면?

   - (4, 4) 입력 데이터에 (3, 3) 필터를 패딩 0, 스트라이드 1로 적용하면 OFM은 (2, 2)가 된다

   - 

   - 딥러닝 프레임워크 중에는 값이 딱 나누어 떨어지지 않을 때, 가장 가까운 정수로 반올림 하는 경우도 있다.

※ 움직이는 데모 : http://cs231n.github.io/convolutional-networks/

http://aikorea.org/cs231n/convolutional-networks/

7.2.5 3차원 데이터의 합성곱 연산

- 채널 방향으로 특징 맵이 늘어남

- 계산순서

- 입력 데이터의 채널 수와 필터의 채널 수가 같아야 한다!!

http://taewan.kim/post/cnn/

7.2.6 블록으로 생각하기

- 3차원의 합성곱 연산은 데이터와 필터를 직육면체 블록으로 생각하면 쉽다!

- 3차원 데이터를 다차원 배열로 나타낼 때는 (채널, 높이, 너비) 순서로 쓴다. (C, H, W), 필터도 (C, FH, FW)

- 출력 데이터를 한 장의 OFM... = 채널이 1장인 OFM -> 출력으로 다수의 채널을 내보려면? 필터를 여러개 사용!!

- 즉, 필터의 갯수가!!!!!! OFM의 채널수가 된다!!!!!!!!

- 이 완성된 블록을 다음 계층으로 넘기겠다는 것이 CNN의 처리 흐름

- 필터의 수도 고려 = 4차원 데이터 (출력 채널 수, 입력 채널 수, 높이, 너비)

   - 채널 수 3개, 크기 5x5 필터가 20개 있다면 (20, 3, 5, 5)

- 편향은? 채널 하나에 값 하나씩 (FN, 1, 1),  (FN, OH, OW) 블록의 대응 채널의 원소 모두에 더해짐

7.2.7 배치 처리 (입력 데이터를 한 덩어리로 묶어 배치 처리)

- 각 계층에 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장 = (데이터 수, 채널 수, 높이, 너비) 순으로 저장

- 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 이뤄진다 = 즉 N회 분의 처리를 한 번에 수행


7.3 폴링 계층

- 풀링 : 세로, 가로 방향의 공간을 줄이는 연산

- 최대 풀링(max pooling) : 최대값을 구하는 연산, 2x2 대상 영역에 대하여 가장 큰 원소를 꺼냄

- 풀링의 윈도우 크기와 스트라이드는 같은 값으로  설정하는 것이 보통

- 평균 풀링(average pooling) : 대상 영역에서 평균을 계산. 주로 이미지 인식 분야에서는 최대 풀링을 사용함

- 풀링 계층의 특징

   1. 풀링 계층은 합성곱 계층과 달리 학습해야 할 매개 변수가 없다. 대상 영역에서 취하는 명학한 처리!

   2. 채널 수가 변하지 않는다. 입력 데이터 채널 수가 3이라면 풀링 후 출력 데이터의 채널 수도 3이다

   3. 입력의 변화에 영향을 적게 받는다(강건하다). 입력 데이터가 조금 변해도 풀링의 결과는 잘 변하지 않는다.


7.4 합성곱/풀링 계층 구현하기

7.4.1 4차원 배열

- 데이터 형상 (10, 1, 28, 28) = 높이 28, 너비 28, 채널 1개인 데이터가 10개

>>> x = np.random.rand(10, 1, 28, 28)

>>> x.shape

(10, 1, 28, 28)

>>> x[0].shape  # 10개 중 첫 번째 데이터에 접근하기

(1, 28, 28)

>>> x[0, 0] # 또는 x[0][0] # 첫 채널의 공간 데이터에 접근하기

7.4.2 im2col로 데이터 전개하기

- 합성곱 연산을 곧이곧대로 구현하려면 for문을 겹겹이 써야하겠지... 귀찮.. 성능도 떨어져.. 대신 im2col 사용

- im2col는 입력 데이터를 필터링하기 좋게 전개하는(펼치는) 함수

- im2col : image to column, 이미지에서 행렬로..

- 3차원 입력 데이터에 im2col을 적용하면 2차원 행렬로 바뀜

- im2col은 필터링하기 좋게 입력 데이터를 전개한다. 그림 7-18 을 보자..

- 전개한 다음에는 합성곱 계층의 필터를 1열로 전개하고 두 행렬의 곱을 계산한다.

- 결과도 2차원 행렬이니 출력 데이터를 4차원으로 변형(reshape)한다.

7.4.3 합성곱 계층 구현하기

- 이 책에서는 im2col 함수를 미리 만들어서 제공 (common/util.py)

def im2col(input_data, filter_h, filter_w, stride=1, pad=0):

    """다수의 이미지를 입력받아 2차원 배열로 변환한다(평탄화).

    

    Parameters

    ----------

    input_data : 4차원 배열 형태의 입력 데이터(이미지 수, 채널 수, 높이, 너비)

    filter_h : 필터의 높이

    filter_w : 필터의 너비

    stride : 스트라이드

    pad : 패딩

    

    Returns

    -------

    col : 2차원 배열

    """

- im2col 테스트

x1 = np.random.rand(1, 3, 7, 7)  # 7x7에 채널 3

col1 = im2col(x1, 5, 5, stride=1, pad=0)

print(col1.shape)


x2 = np.random.rand(10, 3, 7, 7)  # 배치 크기 10

col2 = im2col(x2, 5, 5, stride=1, pad=0)

print(col2.shape)

------------------------ 필터 크기 스트라이드 패딩을 고려하여 2차원 배열로 전개...

(9, 75)  # 2번째 차원의 원소수는 75로 필터의 원소수와 같다(3 x 5 x 5)

(90, 75)

- 합성곱 계층 클래스

class Convoultion:

def __init__(self, W, b, stride=1, pad=0):

self.W = W

self.b = b

self.stride = stride

self.pad = pad


def forware(self, x):

FN, C, FH, FW = self.W.shape

N, C, H, W = x.shape

out_h = int(1 + (H + 2*self.pad - FH) / self.stride)

out_w = int(1 + (W + 2*self.pad - FW) / self.stride)


                # IFM랑 Filter랑 계산 할 수 있게 각자 전개하고 dot으로 계산함

col = im2col(x, FH, FW, self.stride, self.pad)

col_W = self.W.reshape(FN, -1).T  # 필터 전개

out = np.dot(col, col_W) + self.b


                # 다시 형태 돌리기

out = out.reshape(N, out_h, out_w, -1).tanspose(0, 3, 1, 2)


return out

- reshape에 -1을 지정하면 다차원 배열의 원소 수가 변환 후에도 똑같이 유지되도록 적절히 묶어준다... (10, 3, 5, 5)의 원소 수 는 총 750개, reshape(10, -1)을 호출하면 750개의 원소를 10묶으로, 즉 형상이 (10, 75)인 배열로 만들어준다.

- 출력 데이터 형태 바꾸기 위해 transpose 호출, 다차원 배열의 축 순서를 바꿔주는 함수.. (N, H, W, C) 는 인덱스 (0, 1, 2, 3) 인데 이걸 (N, C, H, W)로 바꿔주려면 (0, 3, 1, 2)

- 이상 forward, backward는 common/layer.py 참고;;

7.4.4 풀링 계층 구현하기

- im2col을 사용해서 입력데이터를 전개하지만, 채널 쪽이 독립적

- 이렇게 전개한 행렬에서 행별 최댓값을 구하고 적절한 형상으로 성형

class Pooling: 

....

    def forward(self, x):

        N, C, H, W = x.shape

        out_h = int(1 + (H - self.pool_h) / self.stride)

        out_w = int(1 + (W - self.pool_w) / self.stride)

        # 전개

        col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)

        col = col.reshape(-1, self.pool_h*self.pool_w)

 ...

        # 최대값

        out = np.max(col, axis=1)  # 2차원 배열에서 axis=0은 열방향, axis=1은 행방향

        out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)

...


7.5 CNN 구현하기

- 합성곱 계층과 풀링 계층 조합해서 CNN 조립하기

- ch07/simple_convnet.py : conv - relu - pool - affine - relu - affine - softmax

- ch07/train_convnet.py : CNN으로 MNIST 데이트셋 학습 후 정확도


7.6 CNN 시각화하기

7.6.1 1번째 층의 가중치 시각화하기

- 위의 예제에서 합성곱의 필터는 (30, 1, 5, 5), 필터 30개, 채널 1개 5x5 크기

- 필터의 크기가 5x5이고 채널이 1개라는 것은 이 필터를 1채널의 회색조 이미지로 시각화 할 수 있다는 뜻

- ch07/visualizee_filter.py

- 1번째 층 무엇을 보는 걸까? 에지(색상이 바뀐 경계선)와 블롭(blob, 국소적으로 덩어리진 영역) 등을 보고 있다.

- 예 : 가로 에지와 세로 에지에 반응하는 필터.. 흰 픽셀이 많이 나옴

7.6.2 층 깊이에 따른 추출 정보 변화

- 계층이 깊어질 수로고 추출되는 정보(정확하는 반응하는 뉴런)는 더 추상화된다.

- 1번째 층은 에지와 블롭, 3번째 층은 텍스처, 5번째 층은 사물의 일부, 마지막 완전연결 계층은 사물의 클래스(개, 자동차 등)에 뉴런이 반응한다.

- 층이 깊어지면서 더 복잡하고 추상화된 정보가 추출된다.. 뉴런이 반응하는 대상이 단순한 모양에서 고급정보로 변화해간다. = 의미 이해


7.7 대표적인 CNN

7.7.1 LeNet

- 손글씨 숫자를 인식하는 네트워크로 1998년에 제안됨

- 합성곱 계층과 풀링 계층(원소를 줄이기만 하는 서브샘플링)을 반복하고 마지막으로 완전연결 계층을 거치면서 결과 출력

- LeNet의 활성화함수 는 시그모이드, 오늘날에는 ReLU..

7.7.2 AlexNet

- 2012년 발표됨

- 합성곱 계층과 풀링 계층을 거듭하고 마지막에 완전연결은 LeNet 구조와 같으나

- 활성화 함수로 ReLU 사용, LRN(Local response normalizaion)이라는 국소적 정규화를 실시하는 계층을 이용, 드랍아웃을 사용


- 다른 네트워크 8장에 조금 소개되는듯








- 로드맵

https://www.mindmeister.com/ko/812276967/_


1.1 컴파일러의 필요성 : 간랸한 역사

. 기계어 : C7 06 0000 0002

. 어셈블리어 : mov x, 2

. 어셈블러 : 어셈블리어의 기호코드와 메모리 주소를 기계어의 해당 숫자코드로 번역

. 고급언어 : x = 2 디바이스 독립적

. 촘스키 문법 분류체계(Chomsky hierarchy) : 타입 0, 타입 1, 타입2, 타입 3 문법이라고 하는 4개 수준의 문법으로 구성

   . 타입 2 또는 문맥 자유 문법(context-free grammar)는 프로그래밍 언어에 사용하기 가장 유용하다는 것이 입증됨

. 파싱 문제(parsing problem) : 오늘날 컴파일러 이론의 핵심적인 부분

. 촘스키 타입 3 문법과 상응되는 유한 오토마타(finite automata)와 정규표현식(regular expression)은 문맥 자유 문법과 밀접하게 연결됨

. 파서 생성기(parser generator) : 가장 널리 알려진 것으로 스티븝 존슨이 제작한 Yacc(yet another compiler-compiler)

. 스캐너 생성기(scanner generator) : 가장 널리알려진 것으로 Unix 시스템용으로 마이크 레스크가 개발한 Lex


1.2 컴파일러 관련 프로그램

. 해석기(interpreter) : 번역이 완료된 후 실행되는 목적코드를 생성하는 대신 원시 프로그램을 바로 실행한다. ex) BASIC, LISP

. 어셈블러(assembler) : 특정 컴퓨터의 어셈블리어용 번역기, 어셈블리어는 컴퓨터의 기계어를 기호로 표시한 형태라 번역하기 쉽다

. 링커(linker) : 따로 컴파일되거나 어셈블되어 서로 다른 목적 파일에 저장되어 있는 코드들을 바로 실행할 수 있는 하나의 파일로 모은다. 표준 라이브러리 함수코드 연결 등

. 전처리기(preprocessor) : 실제 번역이 시작되기 전에 컴파일러가 호출하는 독립 프로그램. 주석(comment) 지우기, 매크로 치환(macro substitution) 등


1.3 번역 절차

. 컴파일러는 내부적으로 다른 논리적 기능을 수생하는 여러 실행 단계들로 구성됨

. 세 가지 보조 부품? : 리터럴 테이블(literal table), 심볼 테이블(symbol table), 오류 취급기(error handler)

. 컴파일러의 실행 단계

   

. 스캐너(scanner) : 

   . 문자의 연속으로 되어있는 원시 프로그램을 실제로 읽는다.

   . 문자의 나열에서 영어에서 단어와 같은 토큰(token)이라고 하는 의미있는 단위를 골라내는 어휘 분석(lexical analysis) 실시

   . 예를 들어 a[index] = 4 + 2 는 공백 제외 문자 12개지만 토큰은 8개

 a

식별자

 [

왼쪽 대괄호 

 index

식별자 

 [

오른쪽 대괄호

 =

지정

 4

 +

덧셈 기호

 2

   . 스캐너는 식별자를 심볼 테이블에 넣는 작업을 할 수도 있고, 리터럴(literal)을 리터럴 테이블에 넣는 작업도 할 수 있다.

      . 리터럴은 3.141592와 같은 상수와 "Hello, world!"와 같은 인용 문자열을 의미함

. 파서(parser) :

   . 스캐너로부터 토근을 받아서 프로그램의 구조를 결정하는 구문 분석(syntax analysis) 수행



compiler.md



'개발' 카테고리의 다른 글

plot graph color  (0) 2019.10.04
0713 kernel  (1) 2019.07.13
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
AWS dynamodb  (0) 2018.09.04
aws 네트워크  (0) 2018.08.05

주요내용:

  • 시작구성으로 오토스케일링 그룹 생성하기
  • 오토스케일링으로 가상 서버의 수 조정하기
  • ELB 뒤에서 동기적으로 디커플된 앱 스케일링하기
  • SQS를 사용해서 비동기적으로 디커플된 앱 스케일링하기
  • 클라우드와치 알람으로 오토스케이링 그룹 변경하기


목적 : 생일 파티할 때 음식을 얼마나 준비해야함? 몇명이나 참석할까? 얼마나 먹고 마시나?

  • 인프라가 얼마나 많은 사용자에 대응해야 하는가?
  • 사용자들이 스토리지를 얼마나 많이 소비할까?
  • 사용자의 요청을 허리하는 데 어느 정도의 컴퓨팅 파워가 필요할까?

AWS : 필요하면 즉시 확장하는 기능, 탄력성!

목표 : 현재의 부하를 기반으로 가상 서버의 수를 확장하는 방법을 배운다.

가상 서버의 수 조절 : 오토스케일링 그룹과 AWS의 스케일링 정책으로 할 수 있음
- 오토스케일링은 EC2 서버의 일부, EC2 인스턴스 수 늘리고 줄일 수 있음

선결 조건 : 애플리케이션을 수평 확장 하려면...
1. 확장하려는 서버는 "무상태"여야 한다. 오직 한 서버에서만 사용할 수 있는 로컬 혹은 NAT 디스크에 저장하는 대신 RDS, DynamoDB, S3 같은 서비스를 활용하면 가능
2. 동적 서버 풀의 진입점은 작업 부하를 여러 서버에 분산할 수 있게 하는 데 필요하다. 서버는 로드 밸러서를 통해 동기적으로, 또는 큐를 통해 비동기적으로 디커플링될 수 있음


14.1 동적 서버 풀 관리하기

- AWS는 동적 서버 풀을 관리할 수 있는 오토스케일링 그룹이라는 서비스를 제공한다.

- 오토스케일링 그룹을 활용하면...

. 가상 서버를 원하는 수만큼 실행하고, 그 수를 동적으로 조절 가능

. 똑같은 가상 서버를 시작, 구성, 배포할 수 있음

- 오토스케일링 구성요소 :

. 시작 구성 : 가상서버 크기, 이미지, 구성 정의

. 오토스케일링 그룹 : 시작 구성을 기반으로 실행할 가상 서버의 수를 지정

. 스케일링 정책 : 오토스케일링 그룹에서 원하는 서버의 수를 조정

. p.474 그림 14-2

- 시작구성 작성 :

. 새로운 가상 서버를 정의하고 구성하기 위해 시작 구성 사용함

. p.475 표 14-1 시작 구성 매개변수

- 오토스케일링 그룹 만들기 :

. 가상 서버의 최대, 최소, 원하는 수를 정의

. 원하는 수란? 그 정도의 수의 서버가 실행되고 있어야 함을 의미

. 서버의 현재 수가 원하는 수 미만이라면 오토스케일링 그룹이 서버를 추가하고, 반대면 일부 서버 종료

. EC2 인스턴스의 건강상태를 모니터링하고 고장난 인스턴스를 대체함

. p.476 표 14-2 오토스케이링 그룹 매개변수

- CloudFormation 템플릿을 활용하여 동적 서버 풀 설정

. 예제 14-1 EC2 인스턴스 웹 앱을 위한 오토스케일링


14.2 지표와 스케줄로 스케일링 트리거하기

- 세 번째 구성요소인 스케일링 정책임. 이 정책으로 동적 서버 풀에서 가상 서버의 수를 자동으로 늘리거나 줄여야 함.

- p.478 그림 14-3 클라우드와치 or 스케줄 기반

. 클라우드와치 알람을 사용하여 지표(CPU 사용량, 로그밸런서에 들어오는 요청 수 등)에 따라 가상 서버의 수를 늘리거나 줄인다

. 반복되는 부하 패턴에 맞춰 가상 서버의 수를 늘리거나 줄이는 스케줄을 정의한다


14.2.1 스케줄 기반 스케일링

- 운영하다보면 반복적인 부하 패턴을 알 수 있다

. 많은 사람들이 점심시간인 오전 11시에서 오후 1시 사이에 기사를 읽는 것으로 보임

. 회원 등록 요청은 저녁에 급증

- 패턴에 맞춰 예약 스케일링 작업을 운영할 수 있다.

. 1회성 작업 : starttime 매개변수를 사용해서 생성

. 반복작업 : recurrence 매개변수를 사용해서 생성

- CLI를 활용해서 두 유형의 예약 스케일링 작업 만들 수 있음

. 1회성 스케일링 작업 스케일링하기 : webapp이라는 오토스케일링 그룹의 원하는 용량을 4로 설정함

 $ aws autoscaling put-scheduled-update-group-action --scheduled-action-name ScaleTo4 --auto-scaling-group-name webapp --start-time "2017-01-01T12:00:00Z" --desired-capacity 4

. cron 문법으로 반복스케일링 작업 : 매일 20:00 UTC에 오토스케일링 그룹의 원하는 용량을 2로 설정

$ aws autoscaling put-scheduled-update-group-action --scheduled-action-name ScaleTo2 --auto-scaling-group-name webapp --recurrence "0 20 * * *" --desired-capacity 2 

. 참고 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab


14.2.2 클라우드와치 지표 기반 스케일링

- 현재의 작업부하에 따라 EC2 인스턴스 조절

. p.481 그림 14-4 개념도

- EC2 인스턴스는 기본적으로 클라우드와치에 여러 지표를 전달, 그 중 CPU, 네트워크 및 디스크 사용률이 가장 중요

. https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CW_Support_For_AWS.html

. https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html

- 예제 14.4 : 오토스케일링 그룳에 속하는 모든 가상 서버의 평균 CPU 사용률이 80%를 초과하면 오토스케일링을 통해 가상 서버의 수를 늘리는 알람 생성

- 임계값에 도달하면 클라우드와치 아람이 액션을 트리거, 연결할 스케일링 정책 필요

. 예제 14-5 CloudFormation으로 스케일링 정책 생성


14.3 동적 서버 풀 디커플링하기

- 방문자들은 동적 서버 풀안의 여러 서버 중 게시물을 호스팅하는 서버에 어떻게 도달할 수 있을까? HTTP 요청을 어디로 라우팅해야 하는가?

- 디커플링!!

1. ELB를 활용한 동기적 디커플링

2. SQS를 활용한 비동기적 디커플링

- 디커플링되고 확장 가능한 애플리케이션이 되려면 무상태 서버여야 한다!

.무상태 서버는 모든 공유 데이터를 원격으로 데이터베이스나 스토리지 시스템에 저장한다.

- 두 개의 예

. 워드프레스 블로그 : ELB로 디커플링, CPU 사용률을 기반으로 해서 오토스케이링과 클라우드와치로 스케일링, 데이터 아웃소싱에 RDS와 S3사용

. URL의 스냅샷을 찍는 URL2PNG : SQS 큐로 디커플링, 큐 길이를 기반으로 해서 오토스케일링과 클라우드와치 스케일링, 데이터 아웃소싱에 DynamoDB와 S3사용


14.3.1 로드밸러서를 활용해서 동기적으로 디커플된 동적 서버 풀 스케이링하기

- 웹 애플리이션을 동적 서버 풀로 운영할 때는 로드 밸런서를 사용하는 것이 일반적.

- 로드 밸런서는 동적 서버풀로의 유일한 진입점 역할을 맡아 HTTP(S) 요청을 다중 서버에 라우팅한다.

- 예 : 워드프레스 : p.487 그림 14-6 -> p.488 그림 14.7 전체 개념도

- CLI : BlogID는 대문자 없어야함

$ aws cloudformation create-stack --stack-name jjwordpress --template-url https://s3.amazonaws.com/awsinaction/chapter14/wordpress.json --parameters ParameterKey=BlogID,ParameterValue=jennyblog ParameterKey=AdminPassword,ParameterValue=1234 ParameterKey=AdminEMail,ParameterValue=ws@naver.com --capabilities CAPABILITY_IAM

- 스케일링 테스트하기!

. 짧은 시간에 10,000개 요청을 워드프레스로 보내는 부하 테스트!!! ... 어떻게하지 리눅스도 없구 푸티도 안...못..들어가겠어ㅜ

. 이거 전에 왜 CloudFormation 스택 갱신하라고 하지?ㅠㅠ

. 같이 해보자으앙...


14.4.2 큐를 활용해서 비동기적으로 디커플된 동적 서버 풀 스케일링하기

$ aws cloudformation create-stack --stack-name url2png --template-url https://s3.amazonaws.com/awsinaction/chapter14/url2png.json --parameters ParameterKey=ApplicationID,ParameterValue=myurlpng --capabilities CAPABILITY_IAM

- 앞에꺼랑 차이점은, 클라우드와치 알람이 CPU 사용률 대신 SQS 큐의 길이를 모니터링함

- 이것도 업뎃하래

$ aws cloudformation update-stack --stack-name url2png --template-url https://s3.amazonaws.com/awsinaction/chapter14/url2png-loadtest.json --parameters ParameterKey=ApplicationID,UsePreviousValue=true --capabilities CAPABILITY_IAM




'개발' 카테고리의 다른 글

0713 kernel  (1) 2019.07.13
컴파일러  (0) 2019.01.08
AWS dynamodb  (0) 2018.09.04
aws 네트워크  (0) 2018.08.05
aws 시스템보안  (0) 2018.08.02

Chapter 10. NoSQL : DynamoDB

- NoSQL DB는 4가지 종류가 있다 : 도큐먼트, 키-값 저장소, 그래프, 컬럼 (https://namu.wiki/w/NoSQL#s-5)

- DynamoDB는 키-값 저장소 데이터베이스다.


10.1 DynamoDB 운영하기

- DynamoDB를 사용하면 설치, 업데이트, 서버 스토리지, 백업에 대해 걱정할 필요가 없다.

  . 다운로드할 수 있는 SW가 아니라 서비스로서의 데이터베이스(DaaS) = 설치 할 수 없다.

  . AWS가 운영하는 일련의 서버에서 실행된다.

  . 데이터를 여러 서버와 여러 데이터센터에 복제한다. 백업은 DynamoDB가 책임진다.

- DynamoDB 비용 : https://aws.amazon.com/ko/dynamodb/pricing/

  . 요금 개요에는 GB당 시간당 요금, 쓰기 용량 유닛, 읽기 용량 유닛이 있다.

- RDS와의 비교 (수평적 증가 vs 수직적 증가)

웹 2.0 환경과 빅데이터가 등장하면서 RDBMS는 난관에 부딪히게 되었는데, 바로 ‘데이터를 처리하는 데 필요한 비용의 증가’때문이다. 데이터와 트래픽의 양이 기하급수적으로 증가함에 따라 한 대에서 실행되도록 설계된 관계형 데이터베이스를 사용하는 것은 하드웨어적으로 큰 비용이 들게 되었다. 장비의 성능이 좋을수록, 성능을 향상시키는 데(Scale-up : 수직적 확장) 비용이 기하급수적으로 증가하기 때문이다.

NoSQL은 데이터의 일관성을 약간 포기한 대신 여러 대의 컴퓨터에 데이터를 분산하여 저장하는 것(Scale-out : 수평적 확장)을 목표로 등장하였다. NoSQL의 등장으로 작고 값싼 장비 여러 대로 대량의 데이터와 컴퓨팅 부하를 처리하는 것이 가능하게 되었다.  (나무위키 왈)

  . 처리하는 장비의 성능을 키우는 수직적 확장(Scale-up)과 처리하는 장비의 수를 늘리는 수평적 확장(Scale-out)


10.2 개발자를 위한 DynamoDB

- 테이블 : 아이템의 집합을 구성

- 아이템 : 속성의 모음

- 속성 : 이름-값 쌍으로 이루어짐

  . 속성값은 스칼라(숫자, 문자열, 바이너리, 불리언), 다중값(숫자 집합, 문자 집합, 바이너리 집합) 또는 JSON 문서(객체, 배열)이 될 수 있

- 같은 테이블의 각 아이템은 서로 다른 속성을 가져도 상관없다!! 스키마로 강제하지 않는다!

- 테이블 이름과 키 스키마는 변경 할 수 있음 (여기서 키 스키마는 기본 키ㅋ)


- 기본 키 : 테이블 내에서 고유하고 각 아이템을 식별. 아이템을 찾으려면 필요함.

  . 해시키 단독으로 구성되거나, 해시키와 범위키의 쌍으로 구성된다.

    (해시키는 파티션(partition key)키, 범위키는 정렬키(range)로 바뀌었대)

  . 해시키는 그냥 고유한 기본키 ㅋ 아이템의 속성 하나를 이용해서 해시 인덱스 생성하는 것! ex : { id : jieun }

  . 해시키 + 범위키 : 데이터 검색할 때 범위 부분을 추가해서 조회할 수 있는 것! 범위 부분은 해시 내에서 정렬됨.

     ex : id = jieun, timestamp = 20180907, jieun 이라는 아이디로 20180907에 발생한 데이터를 검색하라


10.3 할일 앱 프로그래밍하기

- nodejs 앱

- 기능 :

  . 사용자 생성 및 삭제

  . 태스크 생성 및 삭제

  . 태스트 완료 표시

  . 태스크 목록 조회 (다양한 필터지원)

  . 태스크를 할당할 수 있는 카테고리

명령어 :

node index.js user-add : 새로운 사용자 추가

                  user-rm : 사용자 제거

                  user-ls : 사용자 조회

                  user : 특정 사용자 상세 조회

                  task-add : 새로운 태스크 추가

                  task-rm : 태스크 삭제

                  task-ls : 태스크 목록 조회

                  task-la : 카테고리별 태스크 목록 조회

                  task-done : 태스크 완료 표시

- 관계형 DB는 SQL로 데이터 생성/조회/갱신/삭제를 하지만

- DynamoDB는 HTTP REST API를 호출하는 SDK로 접근한다!


- 테이블 생성하기 : 정적 스키마를 필요로하진 않지만, 기본키로 사용될 속성은 정의해야 한다!

- 해시키로 사용자 테이블 만들기

aws dynamodb create-table --table-name todo-user --attribute-definitions AttributeName=uid,AttributeType=S --key-schema AttributeName=uid,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

- 테이블 상태 확인

-aws dynamodb describe-table --table-name todo-user

- 복합 기본 키로 태스크 테이블 만들기

  . 태스크는 항상 사용자로부터 수행되는거니까, 태스크 관련 명령어는 항상 사용자 ID를 포함해야함!

  . 모든 태스크 관련 기능에는 사용자 ID가 필요하니, uid를 전체 키의 해시 부분으로 선택하고, 태스크 ID(tid, 생성시 타임스탬프)를 해당 키의 범위 부분으로 선택한다.

aws dynamodb create-table --table-name todo-task --attribute-definitions AttributeName=uid,AttributeType=S AttributeName=tid,AttributeType=N --key-schema AttributeName=uid,KeyType=HASH AttributeName=tid,KeyType=RANGE --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

- Node.js todo 앱 실행하기 (https://github.com/AWSinAction/code/tree/master/chapter10)

  . node.js는 모두 깔려있겠지?

  . 종속성 설치하기 : npm install

  . 사용자 추가 : node index.js user-add jenny hello@myemail.com 01010041004    ----->  user added with uid jenny

  . 태스크 추가 : node index.js task-add jenny "aws study" aws --dueat=20180909

  . 태스크 추가 왜 안돼??   


- 데이터 검색하기

  . 키로 데이터 얻기 : DynamoDB SDK의 getItem 함수 사용

  . 키와 필터로 질의하기 : DynamoDB SDK에 query 라는 함수가 있고, 아이템의 집합을 찾아준다.

     > 인덱스 없이 작동해서 모든 아이템을 검사함으로써 필터링이 느려질 수 있음.

     > query 함수에서 기본키 또는 복합 기본키로 질의할 때에는 KeyConditionExpression

     > query 함수에서는 필터링으로 질의할 때에는 FilterExpression

  . 보조 인덱스 사용하기 : category 속성을 보조 인덱스로 추가하기

     > 원본 테이블을 복사해서 만드는 읽기 전용 테이블이라고 생각해도 됨

     > 인덱스는 스토리지을 요구하고, 원본 테이블과 같은 비용이 발생함

aws dynamodb update-table --table-name todo-task --attribute-definitions AttributeName=uid,AttributeType=S AttributeName=tid,AttributeType=N AttributeName=category,AttributeType=S --global-secondary-index-updates '[{"Create": {"IndexName": "category-index", "KeySchema": [{"AttributeName": "category", "KeyType": "HASH"}, {"AttributeName": "tid", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}, "ProvisionedThroughput": {"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}}}]'

이건 또 왜 안되는거야??

  . 모든 아이템 뒤지기 : scan 함수 사용

    > 반환할 아이템의 최대 수 지정

    > 샘플 예제에서 next가 의미하는게 뭔지 모르겠음


- 최종 일관된 데이터 검색하기

  . DynamoDB에서 원자 단위는 아이템 하나다. 최종 일관성을 제공한다.

  . 여러 개의 서버에 아이템이 있을 수 있고, 한 아이템이 변경되었으면 모든 서버에 전파될 때까지는 변경된 값이 아니라 이전 값을 반환함

  . 최종 일관된 읽기말고 엄격하게 일관된 읽기로 동작하려면 "ConsistentRead":true 추가하면 됨

  . 그러나 최종 일관된 읽기보다 느리고 읽기 용량도 더 소비함


- 아이템 제거 : 기본키로 지정해서 제거 가능. deleteItem API 사용하면 됨


- 데이터 변경 : UpdateExpression 옵션이 있고, updateIdem API 제공

  . 예 : SET attr1 = :attr1val (덮어쓰기), REMOVE attr1 (속성제거)


- 용량 늘리기

  . 테이블이나 전역 보조 인덱스를 생성할 때는 반드시 처리량을 프로비저닝해야 한다.

  . 읽기 용량과 쓰기 용량으로 구분됨. ReadCapacityUnits, WriteCapacityUnits

  . 용량의 단위는 어떻게 지정되는지? 아래 명령어.. DynamoDB에서 사용한 용량 단위 반환

aws dynamodb get-item --table-name todo-user --key '{"uid": {"S": "michael"}}' --return-consumed-capacity TOTAL --query "ConsumedCapacity"   --> getItem은 0.5 용량 단위를 요구한다.

aws dynamodb get-item --table-name todo-user --key '{"uid": {"S": "michael"}}' --consistent-trad --return-consumed-capacity TOTAL --query "ConsumedCapacity"   --> 두배의 용량 단위를 요구한다.



'개발' 카테고리의 다른 글

0713 kernel  (1) 2019.07.13
컴파일러  (0) 2019.01.08
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
aws 네트워크  (0) 2018.08.05
aws 시스템보안  (0) 2018.08.02

6.4 가상 서버를 드나드는 네트워크 트래픽 제어하기

- 방화벽을 활용하여 인바운드(들어오는), 아웃바운드(나가는) 트래픽 제어 가능

- 기본적으로 모든 인바운드 트래픽은 거부하고 모든 아웃바운드 트래픽은 허용한다, 여기에 인바운드 트래픽을 허용하기 시작함

6.4.1 보안 그룹으로 가상 서버의 트래픽 제어하기

- 보안 그룹은 EC2 인스턴스와 같은 AWS 자원에 연결할 수 있다.

- 보안 그룹 규칙

. 방향 (인바운드, 아웃바운드)

. IP 프로토콜 (TCP, UDP, ICMP)

. 출발지/목적지 IP 주소

. 포트

. 출발지/목적지 보안 그룹

"Resources": {

"SecurityGroup": {

"Type": "AWS::EC2::SecurityGroup",

"Properties": {

"GroupDescription": "My security group",

"VpcId": {"Ref": "VPC"}

}

}, 

6.4.2 ICMP 트래픽 허용하기

- 로컬 컴퓨터에서 EC2 인스턴스를 ping 하려면 인바운드 ICMP 트래픽을 허용해야함

"AllowInboundICMP": {

"Type": "AWS::EC2::SecurityGroupIngress",

"Properties": {

"GroupId": {"Ref": "SecurityGroup"},

"IpProtocol": "icmp",

"FromPort": "-1",

"ToPort": "-1",

"CidrIp": "0.0.0.0/0"

}

}, 

6.4.3 SSH 트래픽 허용하기

- 22번 포트의 인바운드 TCP 요청을 허용하는 규칙 만들기

"AllowInboundSSH": {

"Type": "AWS::EC2::SecurityGroupIngress",

"Properties": {

"GroupId": {"Ref": "SecurityGroup"},

"IpProtocol": "tcp",

"FromPort": "22",

"ToPort": "22",

"CidrIp": "0.0.0.0/0"

}

}, 

6.4.4 특정 IP 주소에 대한 SSH 트래픽 허용하기

- 공인 IP 주소알기 : http://api.ipify.org

- 사이더(CIDR) : 주소의 범위, 정확한 IP 주소를 정의하려면 /32, 바이트 경계, 8, 16, 24, 32

. 10.0.0.0/8 은 10.0.0.0~10.255.255.255의 범위를 의미함

6.4.5 출발지 보안 그룹에 SSH 트래픽 허용하기

- 출발지 IP 주소를 기반으로 규칙 말고, 출발지 보안 그룹을 기반으로

- 바스티언 호스트 : 침입 차단 소프트웨어가 설치되어 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트를 뜻함.

- 바스티언 호스트는 SSH를 통해 다른 모든 서버에 도달할 수 있는 유일한 SSH 진입점이다. (보안그룹으로 실현)

"AllowPrivateInboundSSH": {

"Type": "AWS::EC2::SecurityGroupIngress",

"Properties": {

"GroupId": {"Ref": "SecurityGroupPrivate"},

"IpProtocol": "tcp",

"FromPort": "22",

"ToPort": "22",

"SourceSecurityGroupId": {"Ref": "SecurityGroup"}

}

}, 

6.4.6 에이전트 포워딩

- 바스티언 호스트에서 시작된 추가적인 SSH 로그인에 대해 바스티언 호스트에 로그인하는 데 사용한 동일한 키로 인증할 수 있게 한다. (뭔말?)


6.5 크라우드에 사설 네트워크 생성하기 : 가상 사설 클라우드 (VPC)

- Virtual Private Cloud

- 사설이란 공용 인터넷에 연결되지 않은 네트워크를 구축하기 위해 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 범위의 주소를 사용할 수 있다는 것을 의미한다.

- 데이터베이브, 웹 서버, 캐시 서버, 애플리케이션 서버 또는 두 시스템을 분리하고자 할 때는 언제나 새로운 서브넷을 만들 수 있다.

- 예제로 SSH 바스티언 호스트 공용 서브넷, 웹서버를 위한 사설 서브넷, 웹 캐시를 위한 공용 서브넷

6.5.1 VPC와 인터넷 게이트웨이 생성하기

- 첫번째로 VPC와 IGW(인터넷게이트웨이) 자원 필요.

6.5.2 바스티언 호스트용 공용 서브넷 정의하기


'개발' 카테고리의 다른 글

0713 kernel  (1) 2019.07.13
컴파일러  (0) 2019.01.08
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
AWS dynamodb  (0) 2018.09.04
aws 시스템보안  (0) 2018.08.02

- 시스템 보안

1. 소프트웨어 업데이트 설치하기 : 취약점 해결 버전 릴리즈

2. aws 계정에 접근 제한하기 : 모든 EC2를 쉽게 종료할 수 있다! ㄷㄷ

3. EC2 인스턴스를 드나드는 네트워크 트래픽 제어하기 : 필요한 포트만 열고 다 닫기

4. AWS에 사설 네트워크 생성하기 : 서브넷 만들어서 접근 제한하기


6.1 보안에 대한 책임은 누구에게 있는가?

- AWS는 책임 공유 환경 = AWS와 사용자가 책임을 공유

- AWS의 책임 : 

. 디도스 공격 방지 등 강력한 인터넷 접근 감시

. 민감한 영역에 접근했던 직원에 대한 뒷조사 ㄷㄷ

. 수명 다한 스토리지 물리적  파기

. 데이터센터의 물리적, 환경적 보안 보장 (화재 등)

- 사용자의 책임 :

. 네트워크 트래픽 암호화하기(HTTPS)

. 보안그룹과 ACL로 제어하는 가상 사설 네트워크(VPN) 구성

. 소프트웨어 패치 관리

. IAM으로 접근 관리


6.2 소프트웨어를 최신으로 유지하기

- 재빠른 업데이트가 중요허다

6.2.1 보안 업데이트 확인하기

1. ssh로 ec2 인스턴스에 로그인해서 오늘의 메시지 보기 -> 보안 업데이트가 몇개 있는지 알랴줌

$ ssh ec2-user@ec2-52-6-25-163.compute-1.amazonaws.com

2. yum 패키지로 확인하기

$ yum --security check-update

6.2.2 서버 시작시 보안업데이트 설치하기

- 세가지 방법

1. 서버 시작시 모든 업데이트 설치

2. 서버 시작시 보안 업데이트만 설치

3. 명시적 패키지 버전 정의 (권고)

6.2.3 실행 중인 서버에 보안 업데이트 설치하기

- 서버에 일일이 보안 업데이트 명령어 실행할 수 있지만 넘 많다면 -> 스트립트 사용하긔 (chapter6/update.sh에 있다고함)


6.3 AWS 계정 보안

- AWS 계정은 모든 AWS 자원을 포함하고 기본적으로 루트 사용자와 함께 제공된다.

- 공격자가 aws 계정에 접근하려면 사용자의 계정으로 인증할 수 있어야 한다

1. 루트 사용자 및 일반 사용자 사용하기 : 비밀번호나 접근키 필요

2. EC2 인스턴스와 같은 AWS 자원으로 인증 : EC2인스턴스에서 API나 CLI 요청을 보내야함

- 다단계 인증(MFA : Multifactor authentication)으로 루트 사용자 보호 -> 루트 사용자 사용 중지 -> 일상 업무용 새 사용자 생성 -> 최소 권한 부여

6.3.1 AWS 계정의 루트 사용자 보안

- MFA 활성화 !! 우리가 했던 구글 otp 앱으로 한번 더 인증하는거!!ㅎㅎ MFA 토큰이 같이 있어야 로그인 되쥐

6.3.2 인증 및 접근 관리 서비스

- 인증 및 접근 관리 (IAM : Identity and access management) 서비스는 AWS API를 사용하기 위한 인증과 권한 부여에 필요한 모든걸 제공 = 누가 무엇을 할 수 있는지 제어

- IAM에서 인증은 사용자(user)나 역할(role)을 활용하고, 권한부여는 정책(policy)에 의해 수행

- IAM 사용자와 IAM 역할은 권한을 부여하기 위해 정책을 사용한다.

6.3.3 권한 부여 정책

- 정책은 JSON으로 정의

- "Effect" : "Deny" or "Allow"

- "Action" : ["ec2:*"] : 모든 ec2 작업

- "Resource" : ["*"] : ARN(아마존 자원이름) 적는 곳




'개발' 카테고리의 다른 글

0713 kernel  (1) 2019.07.13
컴파일러  (0) 2019.01.08
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
AWS dynamodb  (0) 2018.09.04
aws 네트워크  (0) 2018.08.05

+ Recent posts