SSブログ

半夏生 [相鉄沿線]

今年の半夏生の7月2日
7月には珍しく、こども自然公園の桜山から富士山が見えました。


中池の近くには、半夏生の花が咲いていました。


彼岸花も咲いてた。


空が青く澄み渡り、先日行った乙女高原にも負けない(個人の感想です)爽やかな景色ですが、高原じゃないので、すごく暑い。




日が暮れると、明るい月が昇って来ました。

明日7月3日は、スパー・バック・ムーン(牡鹿月)だそうです。


nice!(13)  コメント(0) 

今週のホタル [相鉄沿線]

蒸し暑い日が続いて


そろそろ、ホタルのシーズンも終わりかなと思いましたが、土曜日の夜は、こんなに沢山の人がホタルを見に集まっていました。


ホタルの方は、数頭に減っていました。


今年は、6月13日ぐらいが、ピークだったのかな?




ホタルのいる沢と反対側の森の中には、タシロランが咲いていました。







nice!(17)  コメント(0) 

今週もホタル [相鉄沿線]

こども自然公園 
土曜日には、ホタルも人も、沢山増えていました。





都心まで乗り入れた相鉄線を利用して、遠くから見に来た人もいたようです。



今週のチョットGPT

最近、日本語のLLM (Large Language Models)がいくつか発表されるようになってきた中で、 rinna/japanese-gpt-neox-3.6b-instruction-ppoというのが、わりと自然な日本語文を作ってくれるようなので、LangChainのUse CasesにあるQuestion Answering over Docsのように使ってみようと思ったのですが、調べてみたけど、まだRinnaのLLMは、対応していないみたいでした。
それなら、自分でRinnaのEmbeddings機能を直接呼び出して作ちゃえ、ということで、やってみました。Rinnaのモデルは、パラメータ数も学習済みデーターも海外のものと比べたら一桁ぐらい小さくて、Rinnaだけでは、ちゃんとしたQAができませんが、外からヒントを与えてあげれば、ちゃんと使えますね。富岳が来年以降に大きなモデルを発表するようですが、それよりは、こんなLLMが早く出てくるのを待っていました。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# rinna/japanese-gpt-neox-3.6b-instruction-ppoの
# tokenaizerとmodelの作成
tokenizer = AutoTokenizer.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-ppo", 
    use_fast=False)
model = AutoModelForCausalLM.from_pretrained(
    "rinna/japanese-gpt-neox-3.6b-instruction-ppo")

# LLMを入れるデバイス(cpu かgpuか)
device = 'cpu'
if torch.cuda.is_available():
    device = 'cuda'
    model = model.to(device)

###
# LLMモデルからembeddings(lookup table)を取得します。
input_embeddings = model.get_input_embeddings()


###
# Rinnnaのtokenizerとembeddingsを利用し
# ドキュメントを読んで、質問の際に使うヒント作成用の
# ベクトル化したデータを作ります。
import numpy as np
import faiss

filename = 'data/kodomosizenkouen.txt'

###
# テキストの読み込み
data = []
maxlen = 512
n = 0

with open(filename) as f:
    for s_line in f:
        if len(s_line) > 30:
            data.append((s_line.strip())[:maxlen])
            n += 1

###
# テキストを埋込み表現にする(ベクトル化)関数
def embedding(text):
    input_ids = (tokenizer(text)).input_ids
    t = torch.LongTensor([input_ids]).to(device)
    embeddings = input_embeddings(t)
    return(torch.mean(embeddings[0], 0).detach())


# 埋込み表現(ベクトル)化
vect = []
for d in data:
    vect.append(embedding(d).to('cpu').detach().numpy().copy())

### FAISSのindexを作る
# 参照: https://github.com/facebookresearch/faiss ,
# https://github.com/facebookresearch/faiss/blob/main/tutorial/python/1-Flat.py

# Rinnaのembeddingsのサイズに合わせてFAISSのindexを用意する
nd = 2816 # dimension
index = faiss.IndexFlatL2(nd)   # build the index

xb = np.array(vect)
index.add(xb)                  # add vectors to the index


### FAISSのindexを使った検索
# (質問をする際に使うヒントの作成) 
def get_some_hint(text, n = 5):
    emb = embedding(text)
    xq = np.array([emb.to('cpu').detach().numpy().copy()])
    D, I = index.search(xq, n)
    hint = ''
    for i in range(len(I[0])):
        hint += data[I[0][i]]
    return hint

###
# 質問文
text = 'こども自然公園でホタルを見ることはできますか'

prompt = [
    {
        "speaker": "ユーザー",
        "text": text
    }
]
prompt = [
    f"{uttr['speaker']}: {uttr['text']}"
    for uttr in prompt
]
prompt = "".join(prompt)
prompt = (
    prompt
    + ""
    + "システム: "
)

token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        do_sample=True,
        max_new_tokens=512,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("", "\n")
print(output)

# ヒント無しの場合の答え
ああ、もちろんです。こども自然公園は、ホタルの生息地の1つで、ホタルの鑑賞に最適な場所です。 ホタルは、6月から7月にかけて、自然公園内の小川や池で見られます。ホタル鑑賞のベストシーズンは、6月下旬から7月中旬です。

# FAISSに格納されている情報をヒントに使う
hint = get_some_hint(text)
prompt = [
    {
        "speaker": "hint",
        "text": hint
    },
    {
        "speaker": "ユーザー",
        "text": text
    }
]
prompt = [
    f"{uttr['speaker']}: {uttr['text']}"
    for uttr in prompt
]
prompt = "".join(prompt)
prompt = (
    prompt
    + ""
    + "システム: "
)

token_ids = tokenizer.encode(prompt, add_special_tokens=False,
    return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        do_sample=True,
        max_new_tokens=512,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("", "\n")
print(output)

# ヒントを与えたときの答え
はい、こども自然公園では、ホタル鑑賞ができます。ホタルは、ゲンジボタルとも呼ばれ、神奈川県内の多くの地域で見ることができます。ホタル観賞は、5月下旬から6月下旬にかけて、主にゲンジボタルが生息する地域で行われます。こども自然公園は、自然豊かな公園で、ホタル鑑賞以外にも、バーベキュー場や動物との触れ合いなどの自然体験を楽しむことができます。



nice!(16)  コメント(0) 

今週のホタル [相鉄沿線]

大雨の後、週末は青空が広がりました。


大風に吹かれてヨレヨレになったタイサンボク


ユリノキ


ホタルも、数が増えてきました。
P1140378.jpg

家には、中国から、こんな光るやつが来ました。

ゲームがしたいわけではなくて、メモリが沢山載っているノートパソコンが欲しかっただけです。
最近、ゲーミングPCが売れていないので、どこのメーカーもすごい安売りをしていて、思わず買ってしまいました。(メモリ64GB, GPU RTX 3080Ti 16GB)

試しに最近はやりのLLM、 mosaicml/mpt-7b-instruct ( https://huggingface.co/mosaicml/mpt-7b-instruct )を動かしてみました。
GPUのメモリ使用量は、13GB程度で、量子化(Quantizationのこと、量子コンピューターとは関係ありません...最近勘違いしている人がいるようです)しなくてもノートPCでも動かせました。
内容は間違っていますが、なんとなくそれっぽい答えが返ってきます。プロプトを工夫したり、チューニングすれば使えるようになるかな...

```
import torch
import transformers

model_name = 'mosaicml/mpt-7b-instruct'
config = transformers.AutoConfig.from_pretrained(model_name, trust_remote_code=True)

config.init_device = 'cuda:0' # For fast initialization directly on GPU!

model = transformers.AutoModelForCausalLM.from_pretrained(
name,
config=config,
torch_dtype=torch.bfloat16, # Load model weights in bfloat16
trust_remote_code=True
)



Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████| 2/2 [00:07<00:00, 3.53s/it]

tokenizer = transformers.GPTNeoXTokenizerFast.from_pretrained(model_name)

text = "What is the Stern-Gerlach experiment ?"

encoded = tokenizer(text, return_tensors = "pt")
generated = model.generate(encoded["input_ids"].cuda(),
max_length=100,
min_length=10,
do_sample=True,
top_k=40)[0]
# Decode the output
decoded = tokenizer.decode(generated)
# Print the output
print(decoded)


What is the Stern-Gerlach experiment?
How does the Stern-Gerlach experiment work?
This experiment shows clearly, and gives a mathematical interpretation of the Ampère's Law. As current is forced through a bar of iron, one end of which is attached to the poles of a powerful electromagnet, the magnetic field created is shown to be such that the electrons in the bar of iron are deflected from their original courses, according to the right hand rule. They

```


nice!(15)  コメント(0) 

月下美人とホタル [相鉄沿線]

毎年6月頃に咲く月下美人、今年は5月24日の朝には、咲いていました。


いつも月下美人が咲く頃には、ホタルが飛び始めるので、金曜日の夜、こども自然公園に行ってみたら、数頭のホタルが飛んでいました。


今年も、昨年のように沢山のホタルが見られるといいな。
nice!(12)  コメント(1) 

ひさしぶりにカワセミに会いました [相鉄沿線]

こども自然公園の中池で、ひさしぶりにカワセミに会いました。




桑の実
今年はもう熟しています。


ビワの実も



近くの空き地では、特定外来生物のオオキンケイギクが大繁殖

繁殖力がとても強くて、在来種を駆逐してしまうので、日本では栽培が禁止されているそうですが、アメリカでは、フロリダ州の花になっています。(日本語のWikipediaには、フロリダ州の花は、ハルシャギクって書いてありますが、英語版 https://en.wikipedia.org/wiki/List_of_U.S._state_and_territory_flowers と写真も違いますね。)
nice!(10)  コメント(0) 

ギンラン [相鉄沿線]

毎年キンランと同じ時期に咲いていたギンランは、今年は少し遅れてるようです。

ササバギンラン

キンランの方が気温の影響を受けやすいのかな?

10年ぐらい前から何度も通っている住宅地の中の道にも、ギンランが咲いていることに今年初めて気が付きました。






ホオノキの大きな花も咲いて、甘い香りが漂っていました。


nice!(11)  コメント(0) 

追分市民の森のキンラン [相鉄沿線]

今週は、追分市民の森でもキンランが咲き始めていました。



アヤメも咲いてる。



アキアカネかな?





いつの間にか、春が終わって初夏になっていたようです。
nice!(12)  コメント(0) 

キンラン [相鉄沿線]

去年より一週間ぐらい早く、キンランが咲いていました。





ウラシマソウも咲いてる。



桜は、今週が見納めですね。



nice!(13)  コメント(0) 

里桜 [相鉄沿線]

こども自然公園の草地広場のサトザクラ


滝匂


福禄寿


紅華(こうか)
まるで小さなバラの花束のようです。




もう藤の花が咲きだしていました。




土曜日に20年間乗った車を廃車にしました。
最後に、走った海軍道路の桜並木(信号で止まっているときに撮影しました。)



nice!(14)  コメント(0)