---
# System prepended metadata

title: Pre-knowledge Review
tags: [APAC HPC-AI competition]

---

---
title: Pre-knowledge Review
tags: APAC HPC-AI competition
---

# APAC HPC-AI Pre-knowledge Review

[TOC]

---

## Everybody leave your comments or questions here: 

:::danger
每個人都要填ㄛ
沒問題就換講者問你問題 :smiley: 
:::
==Deadline: 6/9 00:30. p.m.== :rage:

[This is 教學錄影](https://drive.google.com/file/d/13YZ3g2qDP-YCC76jqWLOE8V0YCwVSIxe/view)

>p.s. 講者回答過每個人的提問之後，就幫通過者打勾勾ㄛ

---

### Python 速成
- [name=Johnson] [name=Angela]
> 今天講的東西都是語法相關，跟一些最基本的用法，而只掌握這些還不足以讓初學者可以稱心如意的開發程式，我想講的一些trick還蠻多的，我建議各位自己多練習一些題目，我可以幫各位看看，是否有更好的寫法，更加的Pythonic。
> 與其漫無目的地增加知識的廣度，不如在特定方面增加深度，在有限的時間內，這是我認為最快掌握新的語言的方法。

- [x] Joycelyn: okay, so I tried Pythonic. how about this
```python=
# I am to give you all the prime number within the boundary you are gonna feed me
prompt = 'Give me a number please: '
n = int(input(prompt))

#create a blank list
"""
p = []
for i in range(n):
	p.append(1)
"""
# This is called list comprehension
p = [ 1 for i in range(n) ]

#calculating and printing primes...
for i in range(2, n):
	if p[i - 1] == 1:
		print(i)
		add = 0
		while add < n:
			add = add + i
			if add < n:
				p[add - 1] = 0
print('are prime numbers.')
print()
```
請求大師指點 :t-rex:
妳的縮排是tab耶，妳是copy-taste到HackMD?是ㄉ。我猜應該是，從view去看蠻明顯的
```python=
# 這個只是介紹generator這個名詞給妳，沒有說這樣比較好
# 不過視覺上我會盡量讓main的部分看起來比較整齊一點，fun就隨便它
def prime_boundary(n):
    """ This is called generator """
    p = [ 1 for i in range(n) ]
    for i in range(2,n):
        if p[i - 1]:
            yield i
            add = 0
            while add < n:
                add += i
                if add < n: p[add - 1] = 0

if __name__ == '__main__':
    # I am to give you all the prime number within the boundary you are gonna feed me
    prompt = 'Give me a number please: '
    n = int(input(prompt))
    
    for prime in prime_boundary(n):
        print(prime, end = ' ')
    
    print('are prime numbers.')
    print()
```
- [x] Emma:其實我的都是小問題啦，自己應該可以解決
- Q1:enumerate是什麼呀?我還是不太懂耶 
```python=
for idx, elem in enumerate(aList):
    print(idx, elem)
```
```python=
# 簡單來說在Python你若要對list(array)取值是可以不必像C/C++那樣透過index去取
# 而是可以直接取值
# 像這樣
for elem in aList:
    print(elem)
# 但有時候妳會同時需要index、element
# 妳或許會這樣寫
i = 0
for elem in aList:
    print(i, aList[i])
    i += 1
# 好一點的，或許會這樣寫
for i in range(len(aList)):
    print(i, aList[i])
# 對於這種情形，Python只是提供了一個內建函式幫妳完成它
# 而為什麼要介紹它，只是我很常在一些文章看到它，我想應該這是一個蠻常使用的函式，值得認識
# 未來看別人的code看到也不會覺得疑惑
for idx, elem in enumerate(aList):
    print(idx, elem)
# 這是我個人認為，在Pythonic的寫法中，可能是會盡量去避免aList[idx]這種寫法
# 或許這樣不好看吧
```
- Q2:" " 跟 ' ' 是不是沒差呀?
「 你沒認真上課!!!基本上是通用的，但字串本身如果有需要使用到其中一種就可以用另一個代替。」— [name=Phoebe]
```python=
a = 'This is a string'
b = "This is also a string"
c = """This is also a string"""
d = """
This is also a string
"""
# 你可以選擇性使用~
```

- [x] Angela:
1. 請問劉老師chat_2_0.py(上週作業)curses，讓他滾回去頂部時，下面的聊天紀錄要清空嗎?
    - 我是沒讓她清空啦
2. 若要清空，是數行數讓他clera否?
    - 我只知道有函式可以清空一行，有沒有一次多行我不知道
        - 求函數式
        - clrtoeol :+1: 感謝你!!!
        - clear to end of line
    - 因為我只有找到清全部的
        - wins.erase()
請求大師開惑:
![](https://i.imgur.com/7RXD4XZ.png)
問題結束了ヾ(＠^∇^＠)ノ

- [x] Phoebe: 
    - 我要回答艾瑪的問題:-)))
 - Q1:之前在tensorflow官網的python快速入門基礎(?)看到的
```python=
enumerate(iterable[, start=0]) -> iterator for index, value of iterable

Return an enumerate object. iterable must be another object that supports iteration.
The enumerate object yields pairs containing a count (from start, which defaults to zero)
and a value yielded by the iterable argument. 
enumerate is useful for obtaining an indexed list:

    (0, seq[0]), (1, seq[1]), (2, seq[2]), ... 
```
  - Q2:你沒認真上課!!!基本上是通用的，但字串本身如果有需要使用到其中一種就可以用另一個代替。
- [x]Joann:
我自己在code上面目前還沒遇到大問題，小問題都還可以解決，不過...
```python=
for idx, elem in enumerate(aList):
    print(idx, elem)
```
在python的enumerate跟c上面就不太一樣嗎?我看這個部分是在列舉aList內的每一項，note上寫這是Pythonic寫法，是說我們一般不會太這樣寫嗎?還是其實都通用阿??

```
以列舉list的每一項可能看不太出來他的用處，可以參考下面的網址
```
[reference link](https://www.quora.com/Why-would-I-want-to-use-enumerate-in-Python-when-a-list-already-saves-the-position-of-its-elements)

- [x] Marvin:我還在try在mac上用Xcode寫python，研究中XD
    - Xcode 我記得是 for C and Swift 的ㄚ 

- [x] Money: 我生不出問題抱歉了老ㄙ 那就換老ㄙ問你嘍 :anguished: 
<font size=10 color='green'>100分</font>
```python=
aList = []
for i in range(10):
    aList.append(i)
for x in range(9,7,-1):
    aList.pop(x)
for x in range(2):
    aList.pop()

x = 8, 9
靠杯 偶看到了 wait wait
等下 先pop掉一個就剩9個了
那第9個就沒東西pop
對，就超出範圍了，這也是一個常見的錯誤
pop真是一個小壞壞
要不要試著改一下啊，讓它可以刪掉最後兩個元素
這樣執行有沒有問題，剛好妳看得刪除跟增加
```


---
### Machine learning
- [name=Phoebe] [name=Emma]
- 各位我很抱歉在講解的時候表達不清QQ(說話是門藝術)，我會盡力在下面解答的
- [x] Joycelyn: 
```
那個ㄚ，我有點不太懂五個 tribes 的關係.. 
Connectionists use backpropagation, 用這次演算的結果調整下次 input 的權重參數;
Evolutionaries discard those 不適者;
Bayesians keep those correct ones base on probability
啊他們不都是著重把不要的資料丟掉留下想要的結果ㄇ？？那為什摩分成三個 tribes 咧？？
```
>那五個部落其實是想表達ML的應用是利用什麼原理去解決一個問題，就像哲學會有歸納法跟演繹法
>Connectionists指的backpropagation(反向傳播)有點像是系統必須先吃下一些所謂的standard，之後才能利用這些standard當作判斷標準。當然給的standard越多精確度也越高。
>Evolutionaries強調的是競爭的觀念，把得到的資訊透過一次次的比較留下最好的(至於好的標準就看當初工程師怎麼設計)。
>Bayesians著重的是概率的觀念，不像connectionists是抓取standard(maybe一個模型)，而是**統計**某個行為或是物件出現的次數去調整自己的判斷標準，進而影響下次的演算。
>這五種看起來相似但實質上利用的原則是不同的，當然我們不能說某一樣產品或功能就只用了其中一種，我舉的例子只是在那個方面特別突出而已，五個部落理念互相融合的應用其實非常多。:+1:
- [x] Angela: 我可以說是五種tribe構成ML嗎? 如果可以，那不同的應用是側重不同的Tribe所產生的嗎?
    - 例如: netflix recommendation， giving points on analigizer
>妳可以這麼說，而一種應用是有可能使用多個tribes的理念的，我會針對某個tribe去舉例是因為該應用特別體現了那個tribe的理念，詳情請看上面給Joycelyn的解答。:+1:
- [x] Joann:
```
Connectionists中提到deep learning是其中的範例，那表示說在五個tribes裡面，deep learning被歸類在這之下的意思嗎?
然後，Evolutionaries這個是以基因演化的機制去演算的嗎?所以是類生物學的是概念對嗎?@@
```
>是的，五個tribe算是分割了ML技術理念，而deep learning是在五個中的connectionists底下衍伸出來的，因為太多技術都是應用到這塊才會流行到直接生出一個名詞。
>Evolutionaries因為強調競爭的觀念，提倡者的說法是他們受到了達爾文的啟發XD，也因為在生物基因研究中常常利用到這種淘汰方式，類生物學的說法是對的
- [x] Johnson:
```
Symbolist: 是指將一些重要資訊丟給機器，讓他自行去推理、演算、歸納，最後找到解答嗎?

Inverse decution: 指的是 p -> q, !q -> !p ?
```
>沒錯，這就是「反推法」的應用，先給系統既定的判斷標準(就像當初提的專家知識)，且這個標準是不變的(就像微積分的算法不會更動，那是定律)，適用在不會受到時間或是環境影響的演算。
- [x] Marvin: 在the five tribes of machine learning裡，genetic programming是指模你生物DNA的進化還是有著生物進化的特性，可以不斷進化自己的演算法
>生物進化的特性就是「適者生存，不是者淘汰」，強調的是競爭的機制，以下是wikipedia對於genetic programming(基因編程)的其中一段解釋:
>遺傳編程是一種特殊的利用進化演算法的機器學習技術，它開始於一群由隨機生成的千百萬個電腦程式組成的「人群」，然後根據一個程式完成給定的任務的能力來確定某個程式的適合度，應用達爾文的自然選擇（適者生存）確定勝出的程式，電腦程式間也類比兩性組合，變異，基因複製，基因刪除等代代進化，直到達到預先確定的某個終止條件為止。
- [x] Money:請問我怎麼還沒被演化論淘汰
    - 一爛還有一爛爛
    - 因為爛爛是本世紀的演化方向
>加油 :laughing: 
---
### RDMA
- [name=Joann] [name=Marvin]
>很抱歉沒有時間好好去講解，然後TCP/IP的架構很多人也是一知半解，因時間關係不允許我說太多，多問一些我會努力解答~~ 然後希望之後有時間可以跟各位好好說明TCP/IP的架構，以及更詳細的，雖然這部分有點枯燥甚至是想睡，但真的頗重要 :kiss: 

- [x] Joycelyn: 如果用傳出和傳入的順序去解釋兩個箭頭咧？TX 表示 transmit from buffer, RX 表示 receive by buffer
![](https://i.imgur.com/msg4S3p.png)
>沒錯TX跟RX確實是這個意思，所以如果以rx跟tx去解釋這張圖，那麼這個就是他們的接收階層關係，就好比tcpip的架構傳輸一般 :+1: 

- [x] Emma:你們說讀取遠方的記憶體要靠網卡本身的幫忙以及protocl的互助，請問可以在說詳細一點嗎?謝謝~~
>這個嘛，就是他需要RDMA可支援的硬體來達到這個功能(ex.比一般的網卡加上更多能力的網卡)，畢竟既然要遠端去讀取，就必須仰賴在網路傳輸中讓他可以忽略對方的CPU
>prtocol也是，就好比以一般的TCP/IP是行不通的，要一直封裝及拆解，並不符合我們對於快速及低CPU使用率的特點，所以必須仰賴更強大的protocl去執行 :+1: 
    
- [x] Angela: Kernel space 比 user space 權限高很多更快，那位甚麼還要user space? 速不溯就不需要了?
>kernel space是使用者無法接觸的空間，屬於系統的權限，那使用者在操作時所使用的空間就是user space，如果沒有user space，這樣就只有系統自己，使用者要怎麼操作呢??這個問題超奇妙的XD
然後我補充一件事，kernel space之所以權限高很多是因為不希望被使用者亂動到系統內部的一些指令，以避免無可返回的遺憾~
>抓!!你是不是想不到問題XD :poop: 

>北發現了XD
>盯者user space & kernel space比較出來的奇怪問題
>比心心心~~~

- [x] Phoebe: 其實對TCP/IP的部分不是很了解，但我想你們也不可能直接教會我你們之前修了一學期的東西，我再努力努力QQ
>這個部分，我有想要在之後meeting許可的情況下，來一點TCPIP架構上簡單的講解，畢竟我覺得還是需要大概的了解一下對之後的走向比較有幫助，禮拜日當天在講的時候真的時間不允許我講那麼多QQ
>>好的:rose:

- [x] Johnson:
```
PPT-Page3, 因此佔用了大量的CPU計算資源和記憶體Bus頻寬，也加大了網路延時, 記憶體Bus頻寬這個是甚麼意思?
```
>非常的抱歉，這個是我手殘，是記憶體頻寬及Bus頻寬才對，Bus就是匯流排~希望有回答道你的問題:)
>那記憶體頻寬是指CPU可以從記憶體(memory)讀取資料或將資料儲存到記憶體的速率，匯流排頻寬是指bus通信線傳輸容量的頻寬 :crying_cat_face: 

- [x] Money:RDMA是一種技術，可是老ㄙ你說它不符合經濟效益，他是在硬體上還是在哪裡會需要某些東西去支撐他的運作嗎?
>這個我們留給[name=馬文]解說
>所謂的經濟效益是指，由於RDMA是一項新的技術，難免會遇到新技術與舊設備不相容的問題，而在ppt第5頁的網路協議中，InfiniBand是專屬於RDMA的網路協定，需要專屬的交換機(Switch)與軟體提升。雖然有較高的穩定性，但成本也雖之提高。
>
>iWARP是基於現有的TCP交換機與網卡上實現RDMA，效能提升有限。
>
>而RoCE可以想成介於IB與iWARP之間，屬於CP值較高的選項。
