---
# System prepended metadata

title: 'What, Why, How?'

---

# What, Why, How?
## ssh
1. What?: SSh dùng để điều khiển một server máy chủ từ máy client - là máy của user đang dùng lệnh ssh trên command line. 
2. How?: ssh {user}@{host}

Có thể tham khảo jupyter remote server trên đây: [jupyter remote server](https://ljvmiranda921.github.io/notebook/2018/01/31/running-a-jupyter-notebook/)
## flask

1. What: được dùng để thiết kế API cho model. API : hiểu đơn giản là phần liên kết giữa cilent và server. Những lúc cilent sử dụng phần mềm nào đó thì dữ liệu hiển thị và truyền đi qua API.
2. How: Các dòng luôn có trong 1 app như:

* app = Flask(__app__) để khởi tạo app.
* @app.route("/x", methods=["..."]): @ kí hiệu cho biết hàm decorate(trang trí), localhost:IP/x là địa chỉ mà cilent sẽ yêu cầu server trả ngược về điều gì đó (là return của hàm trong route trên). Ví dụ

@app.route("/predict", method=["POST"]) thì localhost:IP/predict sẽ render ra nơi để cilent cho input vào truyền đến server rồi server sẽ cho ra output.

Có nhiều method khác nhau nhưng chỉ quan tâm nhiều đến POST và GET: POST là nhận dữ liệu từ cilent, GET là trả render cho cilent

3. Why? có rất nhiều chương trình khác để deploy model trên các mô hình phức tạp. Tuy nhiên Flask đơn giản, bảo mật tốt code dễ trên python.

## Docker

Docker: Được dùng để đóng gói ứng dụng trên 1 máy ảo (containner) để tránh bị xung đột trên nhiều hệ điều hành. Ngoài ra còn có thể trải nghiệm nhiều hệ điều hành hay phần mềm khác nhau trên các container khác nhau, và tất cả chúng đều được chứa trong 1 Image nào đó.

Một vài lệnh của docker trong command line:

**docker build -t X**: tạo image tên X

**docker run -p aaaa:bbbb X**: chạy container theo port aaaa với image hiện có X

**docker ps**: liệt kê các container đang chạy

**docker images**: các images hiện có 

**docker pull**: kéo image từ docker.hub về

**docker volume**: volume đang có (volume được sử dụng để chia sẻ dữ liệu từ host và các container)

**docker rm**: xóa container

**docker rmi**: xóa image

**docker stop**: dừng chạy container

**docker system prune -a**: xóa tất cả các images trong system

Để tạo image từ docker: cần phải cmd vào ĐỊA CHỈ CHỨA FILE DOCKERFILE.

File Dockerfile: Phải đúng tên "Dockerfile" nếu không docker sẽ không chạy. Trong file trên: sẽ có các lệnh cơ bản như:

**FROM**: (xuất hiện đầu tiên trong file): nơi khai báo image cơ sở từ đó tạo ra các container. Ví dụ FROM python:3

**WORKDIR**: địa chỉ thực hiện CMD trên container

**MAINTAINER**: Command này là tùy chọn, có thể có hoặc không. Nó chưa thông tin của người tiến hành xây dựng lên images.

**RUN**: Sử dụng khi muốn thực thi một command trong quá trình build image. Ví dụ build package cho python thì cần các package trong file requirements. Cần phải download các package này trước, trước khi chạy app bằng lệnh :RUN pip install -r requirements.txt

**COPY**: Copy một file từ host machine tới docker image. Có thể sử dụng URL cho tệp tin cần copy, khi đó docker sẽ tiến hành tải tệp tin đó đến thư mục đích.

**ARG**: Định nghĩa các biến cho quá trình build docker image.

**ENV**: Định nghĩa các biến môi trường.

**USER**: Đặt user hoặc UID cho container được tạo bởi image

**ENTRYPOINT**: Định nghĩa những commands sẽ được chạy đầu tiên khi container chạy.

**CMD**: Định nghĩa các commands mặc định khi không có ENTRYPOINT và Extra COMMANDS

**EXPOSE**: là địa chỉ để chạy app


Sau khi build xong images có thể đưa lên dockerhub rồi xóa images ở system. Tới một máy remote nào đó pull về rồi chạy app bình thường bằng cách:

Login tài khoảng docker: docker login -u X
Retag lại images bằng username X: docker tag username/name_image
docker push username/name_image

Sau đó xóa images đang có trong máy rồi pull về load thử.!


File requirements sẽ chứa những packages cần để load app. Chẳng hạn: Flask, transformers, numpy, ...

Ví dụ cơ bản deploy model bằng flask và docker:

1. Tạo một folder có tên hello_docker_flask. Trong đó sẽ có các file: Dockerfile, requirements.txt, app.py
2. Trong app.py viết:

```
from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

@app.route('/', method ='GET')
def home():
    return print('Hello world!!!')

if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True)
```

* 2 dòng đầu để khởi tạo api bằng flask cho model.
* route (xem như hàm trang trí): ở địa chỉ mặc định sẽ print ra Hello world!!!
* host='0.0.0.0': Địa chỉ IP để ứng dụng Flask lắng nghe các kết nối, mặc định giá trị của tham số này là '127.0.0.1' và ứng dụng flask chỉ chấp nhận các kết nối từ máy local. chuyển giá trị này thành '0.0.0.0' để ứng dụng chấp nhận các kết nối từ bên ngoài.

3. Trong requirements.txt chỉ cần flask và flask_restful

4. Trong cmd, gõ: docker build -t hello_docker_flask .
5. image được tạo ra , check bằng lệnh: docker images
6. Chạy image bằng lệnh : docker run -p 5000:5000 hello_docker_flask
7. cmd sẽ hiện ra địa chỉ localhost:5000. Vào chrome và truy cập vào link trên sẽ thấy web Hello world!!!
8. Trong cmd, login tài khoản docker bằng lệnh: docker login -u username
9. docker tag username/hello_docker_flask
10. docker push username/hello_docker_flask
11. Sau đó xóa các images trong máy: docker system prune -a (chú ý lệnh này xóa hết images, nếu chỉ xóa hello_docker_flask thì cần kill thôi)
12. Kéo images trên dockerhub về bằng: docker pull username/hello_docker_flask
13. docker run....

Ngoài ra có thể trang trí thêm các route bằng việc ở lệnh return của mỗi route: return render_template(...), tuy nhiên phải tạo file template trong địa chỉ tạo docker.


## Pip

PIP là một trình quản lý thư viện cho Python, viết tắt của từ Preferred Installer Program. Đây là một tiện ích dòng lệnh cho phép bạn cài đặt, cài đặt lại hoặc gỡ cài đặt các gói PyPI bằng một dòng lệnh đơn giản và dễ hiểu: pip.