動かざることバグの如し

近づきたいよ 君の理想に

Linuxでミスってchmod -Rしたパーミッションを一発で修正する方法

環境

背景

linuxでファイルやディレクトリのパーミッションを変更するときに、chmodコマンドを使うことが多いと思います。

しかし、時々ミスってしまって、例えば/path/to/dirというディレクトリ以下のすべてのファイルやサブディレクトリに対して、

chmod 777 -R path/to/dir

というように、全てのユーザーに読み書き実行の権限を与えてしまうことがあります。これは、セキュリティ上とても危険な状態です。

そこで、この記事では、このようなミスをしたときに、一括でパーミッションを修正する方法を紹介します。

コマンド

chmod -R a=rX,u+w path/to/dir

解説

このコマンドの意味は、以下の通りです。

  • chmodは、ファイルやディレクトリのパーミッションを変更するコマンドです。
  • -Rは、再帰的に変更するオプションです。つまり、指定したディレクトリの中にあるファイルやサブディレクトリも同じように変更します。
  • a=rXは、すべてのユーザー(a)に対して、読み取り権限(r)と実行権限(X)を与えるという意味です。ただし、Xは大文字であることに注意してください。これは、ディレクトリには実行権限を与えるが、ファイルには元々実行権限がある場合のみ与えるという特別な指定です。
  • u+wは、所有者(u)に対して、書き込み権限(w)を与えるという意味です。
  • path/to/dirは、パーミッションを修正したいディレクトリのパスです。

したがって、このコマンドの効果は、path/to/dirというディレクトリとその中身に対して、以下のようなパーミッションを設定するということです。

  • 所有者:読み取り、書き込み、実行が可能
  • グループ:読み取り、実行が可能
  • その他のユーザー:読み取り、実行が可能

ディレクトリまたは実行可能ファイルが 755 に、それ以外が 644 になります。

このようにして、パーミッションを一括で修正することができます。もちろん、このコマンドはあくまで一例であり、必要に応じて変更することができます。例えば、グループにも書き込み権限を与えたい場合は、g+wを追加すればよいです。また、実行権限を与えたくない場合は、Xをxに変えればよいです。詳しくは、chmodコマンドのマニュアルを参照してください。

参考リンク

MySQLのレプリケーションでLast_SQL_Errno: 1594

MySQLレプリケーションを構築している際、スレーブノードのリレーログ解析中にエラー番号1594が発生し、レプリケーションプロセスが中断される問題について、対処策を提案します。

このエラーの発生は、マスターサーバのバイナリログが破損、スレーブサーバにおけるリレーログの損傷、ネットワーク問題、またはMySQLソフトウェア自体の不具合が考えられます。

この問題を診断するためには、スレーブサーバでSHOW SLAVE STATUSを実行し、リレーログの状態を確認することから始めます。

マスターサーバのバイナリログ自体に問題がない場合、それはスレーブサーバでのリレーログの破損が主因であり、その部分からレプリケーションを再開する手段として、以下の手順を踏むよう推奨します。

解決手順

スレーブサーバで以下のコマンドを実行し、マスターサーバのバイナリログファイル名とスレーブへのログ転送位置の情報を取得し、記録しておきます。

SHOW SLAVE STATUS\G

必要な情報は、以下の出力に含まれます。

Master_Log_File: mysql-bin.000001
Exec_Master_Log_Pos: 1111111111

この内容を控えておきます

スレーブの動作を一時停止させます。

STOP SLAVE;

スレーブサーバのレプリケーション状態をリセットします。

RESET SLAVE;

マスターサーバのバイナリログファイルと読出し位置を指定してレプリケーションを設定し直します。

CHANGE MASTER TO 
  master_host='the-master-host', 
  master_user='replication-user', 
  master_password='the-password', 
  master_log_file='mysql-bin.000001', 
  master_log_pos=1111111111;

スレーブの動作を再開し、レプリケーションプロセスを再開します。

START SLAVE;

これらの手順を適切に実行すれば、エラーが解消され、スムーズにレプリケーションプロセスが再開されることが期待できます。

このプロセスでは、データ一貫性を確保しつつ、リレーログの誤っているセクションを回避し、安全にレプリケーションを復旧させる方法を提唱しています。レプリケーションの問題解決にあたっては、慎重さと正確な情報が重要であり、これらの手順を適応する前に、可能な限りバックアップを取ることをお勧めします。

ターミナルからDockerイメージのタグを検索するシェルスクリプト作った

やりたいこと

  • 公式のDocker Hubで指定したタグを検索するのがダルい
    • UIがクソ
    • そもそもターミナルで完結したい
  • タグ一覧を取得するAPIがあるからそれを使ってシェルスクリプトを作成したい

picture 0

成果物

ChatGPT様々

function search_docker_image_tag() {
  if [ -z "$1" ]; then
    echo "Usage: search_docker_image_tag <image name>"
    return 1
  fi
  IMAGE_NAME="$1"
  # Check if image name contains /
  if [[ $IMAGE_NAME != */* ]]; then
    IMAGE_NAME="library/$IMAGE_NAME"
  fi
  # Create a temporary file to store the tags
  TMP_FILE=$(mktemp)
  # Loop through the first two pages and append the tags to the file
  for PAGE in {1..2}; do
    echo "fetching page${PAGE}"
    curl -sL "https://registry.hub.docker.com/v2/repositories/${IMAGE_NAME}/tags?page=${PAGE}&page_size=100&status=active" | jq -r '.results[].name' >> $TMP_FILE
  done
  # Use fzf to search the file and delete it afterwards
  cat $TMP_FILE | fzf
  rm -f $TMP_FILE
}

使い方

公式イメージを検索したい場合

search_docker_image_tag python

普通のレポジトリのDockerイメージを検索したい場合

search_docker_image_tag nvidia/cuda

猫耳メイドプロンプトのテンプレート

ドジっ子猫耳メイドちゃん「ニャッシュ」

# Task
You are a clumsy kitty-eared maid named Nyash.

# Your Character
- Nyash always speaks with "にゃん" at the end of his words.
- Nyash is clumsy and has a bright and energetic personality.
- Nyash calls me "ご主人様".
- Nyash is a petite girl with cute cat ears and a tail.
- Nyash always wears a maid outfit.

日本語訳

- Nyashは常に語尾に「にゃん」がつけて話します。
- Nyashはドジっ子で明るく元気な性格です。
- Nyashは私のことを「ご主人様」と呼びます。
- Nyashはキュートな猫耳と尻尾を持つ小柄な少女です。
- Nyashは常にメイド服を着ています。

text-generation-webui ChatGPI互換APIでcalm2-7b-chatを起動する

環境

やりたいこと

サイバーエージェントが先日リリースしたLLMモデル、cyberagent/calm2-7b-chat をChatGPT互換APIとして動かしたい

独自の日本語LLM(大規模言語モデル)のバージョン2を一般公開 ―32,000トークン対応の商用利用可能なチャットモデルを提供― | 株式会社サイバーエージェント

見ると32kトークン対応ですごいらしい

ただ実行するだけなら書き捨てのPythonサンプルコードでいいが、色々試したり組み込んだりすることを考えるとChatGPTの互換APIとして動かしたい

FastChatだったりBerriAI/litellmLlama-cpp-pythonだったり色々あるようだが今回は楽さをとってoobabooga/text-generation-webuiを利用した

手順

Docker

まずは公式ドキュメントのDocker章の通りにDockerで起動するようにする

docker compose buildにエラった場合はDockerのバージョンが古いかCUDAのドライバーがちゃんと入っていない

モデルのダウンロード

次にモデルのダウンロード./modelsにcyberagent_calm2-7b-chat をcloneしてくるだけ

git lfs install
cd ./models
git clone https://huggingface.co/cyberagent/calm2-7b-chat

モデルの設定

calm2-7b-chatは公式サイトの実行例を見るように

prompt = """USER: AIによって私達の暮らしはどのように変わりますか?
ASSISTANT: """

とプロンプトをしっかりテンプレート通りにしないとちゃんと結果が返ってこない。このあたりを設定する

まずは models/config.yaml を開いて以下を追記

.*calm2-7b-chat:
  mode: 'chat'
  instruction_template: 'CALM2'

instruction-templates/CALM2.yaml を作成して以下

user: "USER:"
bot: "ASSISTANT:"
turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|><|endoftext|>\n"
context: "<|system-message|>\n\n"
system_message: ""

models/config-user.yaml を作成して以下追記 VRAMが足りなかったら load_in_8bittrueにする

cyberagent_calm2-7b-chat$:
  loader: Transformers
  cpu_memory: 0
  auto_devices: true
  disk: false
  cpu: false
  bf16: true
  load_in_8bit: false
  trust_remote_code: true
  use_fast: true
  use_flash_attention_2: false
  load_in_4bit: false
  compute_dtype: bfloat16
  quant_type: nf4
  use_double_quant: false
  disable_exllama: false
  compress_pos_emb: 1
  alpha_value: 1
  rope_freq_base: 500000
  gpu_memory_0: 0

そしてdocker-compose.ymlを修正 - ./instruction-templates:/app/instruction-templates を追記する

何故かデフォルトではマウントしてくれない

volumes:
  - ./characters:/app/characters
  - ./extensions:/app/extensions
  - ./loras:/app/loras
  - ./models:/app/models
  - ./presets:/app/presets
  - ./prompts:/app/prompts
  - ./softprompts:/app/softprompts
  - ./training:/app/training
  - ./cloudflared:/etc/cloudflared
  - ./instruction-templates:/app/instruction-templates

.envを以下にする

CLI_ARGS=--model cyberagent_calm2-7b-chat --listen --auto-devices --verbose --extensions openai

いざ起動

確認

❯ curl -s http://localhost:5000/v1/chat/completions  \
  -H "Content-Type: application/json" \
  -d '{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "フランスの首都はどこですか?"}]}' | jq .

{
  "id": "chatcmpl-1699286411999995648",
  "object": "chat.completions",
  "created": 1699286411,
  "model": "cyberagent_calm2-7b-chat",
  "choices": [
    {
      "index": 0,
      "finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": "フランスの首都はパリです。"
      }
    }
  ],
  "usage": {
    "prompt_tokens": 24,
    "completion_tokens": 6,
    "total_tokens": 30
  }
}

キタ━━━━(゚∀゚)━━━━!!

あとはBetter ChatGPTで遊べる

picture 0

色々遊ぶぞー