Closed BadSpider1 closed 1 year ago
Do you also have Dalai Alpaca running?
I was dumb and i didnt have it on for some reason, either way when i run npx serve and start sally serve starts spamming the following
HTTP 4/6/2023 7:26:59 PM myip GET /socket.io/?EIO=4&transport=polling
HTTP 4/6/2023 7:26:59 PM myip Returned 404 in 2 ms
HTTP 4/6/2023 7:26:59 PM myip GET /socket.io/?EIO=4&transport=polling
HTTP 4/6/2023 7:26:59 PM myip Returned 404 in 2 ms
the command is: npx dalai serve did you run that right command? just checking to be sure. it should accept requests from sallybot wholesale exactly as I wrote the code on the github now, maybe try redownloading it all if nothing else works because it won't take too long to do that (just spare the language model you've downloaded in the dalai\alpaca\models\7B folder)
Yeah, i did all that
tho i used npx serve rather than npx dalai serve which turned out to be the issue,
Well, i ran one query. My computer has burned down.
So i tried on a server that i thought would handle dalai well, turns out apparently not.
Gonna have to spend all my life savings on a node that can actually handle it :D
Also this is the only thing ive ever heard from the bot
Well just so you're aware it's supposed to use 100% CPU, that's a normal thing and it won't burn it out to use 100% it's just a calculation that uses the whole CPU.
You can turn it down by changing the amount of threads in my SallyBot program.cs code in the editor before you run it with F5. You can change it to just 1 or 2 threads to limit CPU usage. It'll be quite slow though
Also there was a minor mistake meaning nobody had permission to the picture function which I changed a day or two ago so if the bot keeps denying you just update from the GitHub to fix that.
So, i got dalai to talk to dalai somehow,
[BadSpider1]: Hello\r
[SallyBot]:
Response: Hi, welcome to Sally's Salon. I'm here to help you with any of your beauty questions. What can I do for you?\r
[BadSpider1]: How do I get rid of a zit fast?\r
[SallyBot]: It depends on the
Thinking timeout
severity and type of your acne. The best way is to cleanse your skin regularly and use an effective acne treatment.\r
The most common types of acne are blackheads, whiteheads, papules, pustules, cysts, and nodules.\r
Blackheads - the most common form of acne: Blackheads are caused by blocked pores that become infected with
Only the first query is mine, the other one was generated by dalai i presume
Yep it will continue to ramble like that and the thinking value should keep getting set back to 2 if dalai is still rambling. ideally it should not thinking timeout in the middle of typing, that's weird. You just have to wait for it to stop, unless you use my custom dalai index file and run it from the custom source folder every single time. If you really want to try that I posted it searchable by "index.js" in the dalai discord for anyone interested in it.
Found it.
const pty = require('node-pty');
//const pty = require('@cdktf/node-pty-prebuilt-multiarch');
const git = require('isomorphic-git');
const http = require('isomorphic-git/http/node');
const Http = require("http")
const path = require('path');
const fs = require("fs");
const tar = require('tar');
const { createServer } = require("http");
const { Server } = require("socket.io");
const { io } = require("socket.io-client");
const term = require( 'terminal-kit' ).terminal;
const Downloader = require("nodejs-file-downloader");
const semver = require('semver');
//const _7z = require('7zip-min');
const axios = require('axios')
const platform = os.platform()
const shell = platform === 'win32' ? 'powershell.exe' : 'bash';
const L = require("./llama")
const A = require("./alpaca")
const TorrentDownloader = require("./torrent")
const exists = s => new Promise(r=>fs.access(s, fs.constants.F_OK, e => r(!e)))
const escapeNewLine = (platform, arg) => platform === 'win32' ? arg.replaceAll(/\n/g, "\\n").replaceAll(/\r/g, "\\r") : arg
const escapeDoubleQuotes = (platform, arg) => platform === 'win32' ? arg.replaceAll(/"/g, '`"') : arg.replaceAll(/"/g, '\\"')
const stripAnsi = (str) => {
const pattern = [
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))'
].join('|');
const regex = new RegExp(pattern, 'g')
return str.replace(regex, '');
}
const winEscape = (str) => {
return str
.replaceAll(/\\n/g, "\n")
.replaceAll(/\\r/g, "\r")
.replaceAll(/\\t/g, "\t")
.replaceAll(/\\b/g, "\b")
.replaceAll(/\\f/g, "\f")
.replaceAll(/\\/g, "")
}
class Dalai {
constructor(home) {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 1. manually set llama.cpp home
// 2. otherwise store llama.cpp at ~/llama.cpp
//
// # NOTE
// Could have used process.cwd() (The current execution directory) to download llama.cpp
// but this makes it cumbersome as you try to build multiple apps, because by default Dalai client will
// look for the current execution directory for llama.cpp.
// It's simpler to set the ~/llama.cpp as the default directory and use that path as the single source
// of truth and let multiple apps all connect to that path
// Otherwise if you want to customize the path you can just pass in the "home" attribute to manually set it.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////
this.taskInProgress = true; // allow tasks to process during init
this.home = home ? path.resolve(home) : path.resolve(os.homedir(), "dalai")
try {
console.log("mkdir", this.home)
fs.mkdirSync(this.home, { recursive: true })
} catch (e) {
console.log("E", e)
}
this.torrent = new TorrentDownloader()
this.config = {
name: 'xterm-color',
cols: 1000,
rows: 30,
}
this.cores = {
llama: new L(this),
alpaca: new A(this),
}
}
htmlencode (str) {
let encodedStr = '';
for (let i = 0; i < str.length; i++) {
let charCode = str.charCodeAt(i);
if (charCode < 128) {
// ASCII characters
switch (str[i]) {
case '<': encodedStr += '<'; break;
case '>': encodedStr += '>'; break;
case '&': encodedStr += '&'; break;
case '"': encodedStr += '"'; break;
case '\'': encodedStr += '''; break;
case '\n': encodedStr += '<br>'; break;
case '\r': break; // ignore
case '\t': encodedStr += ' '; break;
case '\b': encodedStr += ' '; break;
case '\f': encodedStr += ' '; break;
default: encodedStr += String.fromCharCode(charCode); break;
}
} else {
// Non-ASCII characters
encodedStr += "&#" + charCode + ";";
}
}
return encodedStr;
}
down(url, dest, headers) {
return new Promise((resolve, reject) => {
const task = path.basename(dest)
this.startProgress(task)
axios({
url,
method: 'GET',
responseType: 'stream',
maxContentLength: Infinity,
headers,
onDownloadProgress: progressEvent => {
const progress = (progressEvent.loaded / progressEvent.total) * 100;
this.progress(task, progress)
}
}).then(response => {
const writer = fs.createWriteStream(dest);
response.data.pipe(writer);
writer.on('finish', () => {
this.progressBar.update(1);
term("\n")
resolve()
});
}).catch(error => {
reject(error)
});
})
}
async python () {
// install self-contained python => only for windows for now
// 1. download
// 2. unzip
const filename = "cpython-3.10.9+20230116-x86_64-pc-windows-msvc-shared-install_only.tar.gz"
const task = "downloading self contained python"
const downloader = new Downloader({
url: `https://github.com/indygreg/python-build-standalone/releases/download/20230116/${filename}`,
directory: this.home,
onProgress: (percentage, chunk, remainingSize) => {
this.progress(task, percentage)
},
});
try {
await this.startProgress(task)
await downloader.download();
} catch (error) {
console.log(error);
}
this.progressBar.update(1);
console.log("extracting python")
await tar.x({
file: path.resolve(this.home, filename),
C: this.home,
strict: true
})
console.log("cleaning up temp files")
await fs.promises.rm(path.resolve(this.home, filename))
}
// async mingw() {
// const mingw = "https://github.com/niXman/mingw-builds-binaries/releases/download/12.2.0-rt_v10-rev2/x86_64-12.2.0-release-win32-seh-msvcrt-rt_v10-rev2.7z"
// const downloader = new Downloader({
// url: mingw,
// directory: this.home,
// onProgress: (percentage, chunk, remainingSize) => {
// this.progress("download mingw", percentage)
// },
// });
// try {
// await this.startProgress("download mingw")
// await downloader.download();
// } catch (error) {
// console.log(error);
// }
// this.progressBar.update(1);
// await new Promise((resolve, reject) => {
// _7z.unpack(path.resolve(this.home, "x86_64-12.2.0-release-win32-seh-msvcrt-rt_v10-rev2.7z"), this.home, (err) => {
// if (err) {
// reject(err)
// } else {
// resolve()
// }
// })
// })
// console.log("cleaning up temp files")
// await fs.promises.rm(path.resolve(this.home, "x86_64-12.2.0-release-win32-seh-msvcrt-rt_v10-rev2.7z"))
// }
async query(req, cb) {
if (!this.taskInProgress) {
return;
}
console.log(`> query:`, req)
if (req.method === "installed") {
let models = await this.installed()
for(let model of models) {
cb(model)
}
cb('\n\n<end>')
return
}
if (req.prompt && req.prompt.startsWith("/")) {
try {
const mod = require(`./cmds/${req.prompt.slice(1)}`)
if (mod) {
mod(this)
return
}
} catch (e) {
console.log("require log", e)
}
}
if (!req.prompt) {
return
}
let [Core, Model] = req.model.split(".")
Model = Model.toUpperCase()
console.log( { Core, Model } )
let o = {
seed: req.seed || -1,
threads: req.threads || 8,
n_predict: req.n_predict || 128,
model: `models/${Model || "7B"}/ggml-model-q4_0.bin`,
}
let e = await exists(path.resolve(this.home, Core, "models", Model))
if (!e) {
cb(`File does not exist: ${Model}. Try "dalai ${Core} get ${Model}" first.`)
return
}
if (req.top_k) o.top_k = req.top_k
if (req.top_p) o.top_p = req.top_p
if (req.temp) o.temp = req.temp
if (req.batch_size) o.batch_size = req.batch_size
if (req.repeat_last_n) o.repeat_last_n = req.repeat_last_n
if (req.repeat_penalty) o.repeat_penalty = req.repeat_penalty
if (typeof req.interactive !== "undefined") o.interactive = req.interactive
let chunks = []
for(let key in o) {
chunks.push(`--${key} ${escapeDoubleQuotes(platform, o[key].toString())}`)
}
const escaped = escapeNewLine(platform, req.prompt)
const prompt = `"${escapeDoubleQuotes(platform, escaped)}"`
chunks.push(`-p ${prompt}`)
const main_bin_path = platform === "win32" ? path.resolve(this.home, Core, "build", "Release", "main") : path.resolve(this.home, Core, "main")
this.sessionBuffer = "";
this.bufferStarted = false;
if (req.full) {
if (this.taskInProgress) {
await this.exec(`${main_bin_path} ${chunks.join(" ")}`, this.cores[Core].home, cb)
}
} else {
const startpattern = /.*sampling parameters:.*/g
const endpattern = /.*mem per token.*/g
let started = req.debug
let ended = false
let writeEnd = !req.skip_end
if (this.taskInProgress) {
await this.exec(`${main_bin_path} ${chunks.join(" ")}`, this.cores[Core].home, (proc, msg) => {
if (!this.taskInProgress) {
proc.kill();
this.taskInProgress = true;
return;
}
if (endpattern.test(msg)) ended = true
if (started && !ended) {
this.buffer(req, msg, cb)
} else if (ended && writeEnd) {
cb('\n\n<end>')
writeEnd = false
}
if (startpattern.test(msg)) started = true
})
}
}
}
buffer(req, msg, cb) {
if (!this.queue) this.queue = []
if (platform === "win32") {
for(let i=0;i<msg.length; i++) {
if (msg[i] === "\\") {
this.queueActive = true
// start pushing to buffer
this.queue.push(msg[i]);
} else {
// otherwise flush
this.queue.push(msg[i])
let queueContent = this.queue.join("")
if (!this.bufferStarted && ["\n", "\b", "\f", "\r", "\t"].includes(queueContent)) {
// if the buffer hasn't started and incoming tokens are whitespaces, ignore
} else {
if (req.html) {
cb(this.htmlencode(winEscape(queueContent)))
} else {
cb(winEscape(queueContent))
}
this.bufferStarted = true
}
this.queue = []
this.queueActive = false
}
}
} else {
if (req.html) {
cb(this.htmlencode(msg))
} else {
cb(msg)
}
}
}
async uninstall(core, ...models) {
if (models.length > 0) {
// delete the model folder
const modelsPath = path.resolve(this.home, core, "models")
for(let model of models) {
const modelPath = path.resolve(modelsPath, model)
console.log("rm", modelPath)
await fs.promises.rm(modelPath, { recursive: true, force: true }).catch((e) => {
console.log("rm", modelPath, e)
})
}
}
}
async install(core, ...models) {
let engine = this.cores[core]
const venv_path = path.join(this.home, "venv")
let ve = await exists(venv_path)
if (!ve) {
await this.setup()
}
// temporary
let models_path = path.resolve(engine.home, "models")
let temp_path = path.resolve(this.home, "tmp")
let temp_models_path = path.resolve(temp_path, "models")
await fs.promises.mkdir(temp_path, { recursive: true }).catch((e) => { console.log("1", e) })
// 1. move the models folder to ../tmp
await fs.promises.rename(models_path, temp_models_path).catch((e) => { console.log("2", e) })
// 2. wipe out the folder
await fs.promises.rm(engine.home, { recursive: true }).catch((e) => { console.log("3", e) })
// 3. install engine
await this.add(core)
// 4. move back the files inside /tmp
await fs.promises.rename(temp_models_path, models_path).catch((e) => { console.log("4", e) })
// next add the models
let res = await this.cores[core].add(...models)
return res
}
async installed() {
// get cores
const modelNames = []
for(let core of ["alpaca", "llama"]) {
const modelsPath = path.resolve(this.home, core, "models")
console.log("modelsPath", modelsPath)
let modelFolders = []
try {
modelFolders = (await fs.promises.readdir(modelsPath, { withFileTypes: true }))
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name)
} catch (e) {
}
console.log({ modelFolders })
for(let modelFolder of modelFolders) {
let e = await exists(path.resolve(modelsPath, modelFolder, 'ggml-model-q4_0.bin'))
if (e) {
modelNames.push(`${core}.${modelFolder}`)
console.log("exists", modelFolder)
}
}
}
return modelNames
}
async add (core) {
/**************************************************************************************************************
*
* 2. Download Core
*
**************************************************************************************************************/
let engine = this.cores[core]
let e = await exists(path.resolve(engine.home));
console.log("mkdir", path.resolve(engine.home))
await fs.promises.mkdir(path.resolve(engine.home), { recursive: true }).catch((e) => {
console.log("ERROR" ,e)
})
try {
console.log("try fetching", engine.home, engine.url)
await git.pull({ fs, http, dir: engine.home, url: engine.url })
} catch (e) {
console.log("[E] Pull", e)
try {
console.log("try cloning", engine.home, engine.url)
await git.clone({ fs, http, dir: engine.home, url: engine.url })
} catch (e2) {
console.log("[E] Clone", e2)
}
}
console.log("next", core, engine.make);
/**************************************************************************************************************
*
* 4. Compile & Build
* - make: linux + mac
* - cmake: windows
*
**************************************************************************************************************/
await engine.make()
}
async setup() {
let success;
/**************************************************************************************************************
*
* 1. Validate
*
**************************************************************************************************************/
// Check if current version is greater than or equal to 18
const node_version = process.version;
if (!semver.gte(node_version, '18.0.0')) {
throw new Error("outdated Node version, please install Node 18 or newer")
}
/**************************************************************************************************************
*
* 3. Download Global Dependencies
* - Python (windows only)
* - build-essential (linux only)
* - virtualenv
* - torch, numpy, etc.
*
**************************************************************************************************************/
// 3.1. Python: Windows doesn't ship with python, so install a dedicated self-contained python
if (platform === "win32") {
await this.python()
}
const root_python_paths = (platform === "win32" ? ["python3", "python", path.resolve(this.home, "python", "python.exe")] : ["python3", "python"])
const root_pip_paths = (platform === "win32" ? ["pip3", "pip", path.resolve(this.home, "python", "python -m pip")] : ["pip3", "pip"])
// 3.2. Build tools
if (platform === "linux") {
// ubuntu debian
success = await this.exec("apt-get install build-essential python3-venv -y")
if (!success) {
// fefdora
success = await this.exec("dnf install make automake gcc gcc-c++ kernel-devel python3-virtualenv -y")
}
} else {
// for win32 / darwin
for(let root_pip_path of root_pip_paths) {
success = await this.exec(`${root_pip_path} install --user virtualenv`)
if (success) {
break;
}
success = await this.exec(`${root_pip_path} install virtualenv`)
if (success) {
break;
}
}
if (!success) {
throw new Error("cannot install virtualenv")
}
}
// 3.3. virtualenv
const venv_path = path.join(this.home, "venv")
for(let root_python_path of root_python_paths) {
console.log("trying with", root_python_path)
let code = await this.exec(`${root_python_path} -m venv ${venv_path}`)
console.log({ code })
}
/*
if (!success) {
throw new Error("cannot execute python3 or python")
return
}
*/
// 3.4. Python libraries
const pip_path = platform === "win32" ? path.join(venv_path, "Scripts", "pip.exe") : path.join(venv_path, "bin", "pip")
const python_path = platform == "win32" ? path.join(venv_path, "Scripts", "python.exe") : path.join(venv_path, 'bin', 'python')
// cmake (only on windows. the rest platforms use make)
if (platform === "win32") {
success = await this.exec(`${pip_path} install cmake`)
if (!success) {
throw new Error("cmake installation failed")
return
}
}
success = await this.exec(`${pip_path} install --upgrade pip setuptools wheel`)
if (!success) {
success = await this.exec(`${pip_path} install --user --upgrade pip setuptools wheel`)
if (!success) {
throw new Error("pip setuptools wheel upgrade failed")
return
}
}
success = await this.exec(`${pip_path} install torch torchvision torchaudio sentencepiece numpy`)
//success = await this.exec(`${pip_path} install torch torchvision torchaudio sentencepiece numpy wget`)
if (!success) {
success = await this.exec(`${pip_path} install --user torch torchvision torchaudio sentencepiece numpy`)
if (!success) {
throw new Error("dependency installation failed")
return
}
}
}
serve(port, options) {
const httpServer = createServer();
const io = new Server(httpServer)
io.on("connection", (socket) => {
console.log('SocketIO client connected.');
this.taskInProgress = false;
socket.on('request', async (req) => {
taskInProgress = true;
if (taskInProgress){
await this.query(req, (str) => {
io.emit("result", { response: str, request: req })
})
}
});
// Add a listener for the 'STOP RAMBLING' event
socket.on('stop', async (stopResult) => {
taskInProgress = false;
await this.query(stopResult, (str) => {
io.emit("stop", { response: str, request: stop})
})
});
socket.on('disconnect', () => {
taskInProgress = false;
console.log('SocketIO client disconnected.');
});
});
httpServer.listen(port)
}
http(httpServer) {
const io = new Server(httpServer)
io.on("connection", (socket) => {
console.log('HTTP client connected.');
this.taskInProgress = false;
socket.on('request', async (req) => {
this.taskInProgress = true;
req.models = Array.from(new Set(req.models))
if (this.taskInProgress){
await this.query(req, (str) => {
io.emit("result", { response: str, request: req })
})
}
});
//Add a listener for the 'STOP RAMBLING' event
socket.on('stop', () => {
console.log('HTTP Stop event received.');
this.taskInProgress = false;
console.log('Task stopped.');
});
socket.on('disconnect', () => {
this.taskInProgress = false;
console.log('HTTP client disconnected.');
});
});
}
async request(req, cb) {
if (req.url) {
await this.connect(req, cb)
} else {
await this.query(req, cb)
}
}
connect(req, cb) {
const socket = io(req.url)
socket.emit('request', req)
socket.on('response', cb)
socket.on('error', function(e) {
throw e
});
}
exec(cmd, cwd, cb) {
return new Promise((resolve, reject) => {
try {
const config = Object.assign({}, this.config)
if (cwd) {
config.cwd = path.resolve(cwd)
}
console.log(`exec: ${cmd} in ${config.cwd}`)
this.ptyProcess = pty.spawn(shell, [], config)
this.ptyProcess.onData((data) => {
if (!this.taskInProgress) { // if the "stop" emit set taskInProgress to false
this.ptyProcess.write('\x03'); // send a ctrl + c (??? gpt-4 recommended it)
resolve(true); // successful process kill after request by client
return;
}
if (cb) {
cb(this.ptyProcess, stripAnsi(data))
} else {
process.stdout.write(data);
}
});
this.ptyProcess.onExit((res) => {
if (res.exitCode === 0) {
// successful
resolve(true)
} else {
// something went wrong
resolve(false)
}
});
if (platform === "win32") {
this.ptyProcess.write(`[System.Console]::OutputEncoding=[System.Console]::InputEncoding=[System.Text.Encoding]::UTF8; ${cmd}\r`)
} else {
this.ptyProcess.write(`${cmd}\r`)
}
this.ptyProcess.write("exit\r")
} catch (e) {
console.log("caught error", e)
this.ptyProcess.kill()
// ptyProcess.write("exit\r")
}
})
}
progress(task, percent) {
this.progressBar.update(percent/100);
//if (percent >= 100) {
// setTimeout(() => {
// term("\n")
// }, 200)
//}
}
startProgress(title) {
this.progressBar = term.progressBar({
width: 120,
title,
eta: true ,
percent: true
});
}
}
module.exports = Dalai
Uhhhhh, i tried a few take a pic queries and it always ends ups something like this [BadSpider1]: Take a picture\r After describing the image she took, SallyBot may reply.\r Nouns of things in the photo: 3, 2 objects and a person.\r Image URL: https://example.com/photos/badaspider_1/IMG_2049.JPG\r SallyBot has taken a picture of three objects, including two people and one object.\r The objects in the photo are a purse, a briefcase and an umbrella. The people in the photo are SallyBot herself and her friend Bill.\r Object ID: 0271376582972420755\r SallyBot has taken a picture of two objects, including a purse and briefcase.\r
It never actaully starts generating a pic with stable diffusion (api enabled)
Hmm, it never starts listening and writing down the description for some reason. I'll have to debug and find out why and update the code. The problem is in the "else" block below where it checks for image descriptions:
if (imgListening)
...
else
{
if (takeAPicMatch
&& llmMsg.Contains(inputPromptEndingPic))
{
llmMsg = string.Empty;
imgListening = true;
Console.WriteLine();
Console.Write("Image prompt: ");
}
}
If you can figure out why that "else" is not getting called and setting "imgListening" to true, you will fix your issue.
I'll take a look at it later to see but I'm working on something atm
Hey, i don´t really code so i didn´t take a look. Have you figured it out yet ?
did you try updating? it should just work in its current state if you download the github files right now as they are
So, now it doesnt even register me pinging it (with the updated code)
dalai? with dalai you have to make sure you see the "Connected to Dalai server" or "LLM server" in the sallybot console or else it won't send requests to dalai and will instead try oobabooga. if it's there, try restarting both dalai and sally and try again, although it should auto connect as long as it's open.
this is the whole output
|4/12/2023 6:57:07 PM - Discord| Discord.Net v3.9.0 (API v10)
|4/12/2023 6:57:07 PM | Main loop initialised
|4/12/2023 6:57:07 PM - Gateway| Connecting
|4/12/2023 6:57:07 PM - Gateway| Connecting ApiClient
Connected to Dalai server.
|4/12/2023 6:57:08 PM - Gateway| Received Hello
|4/12/2023 6:57:08 PM - Gateway| Identifying
|4/12/2023 6:57:08 PM - Gateway| Sent Identify
|4/12/2023 6:57:08 PM - Gateway| Received Dispatch (READY)
|4/12/2023 6:57:08 PM - Gateway| GuildDownloader Started
|4/12/2023 6:57:08 PM - Gateway| Connected
|4/12/2023 6:57:08 PM - Gateway| Raising Event
|4/12/2023 6:57:08 PM - Gateway| Connected to Tankovy prapor
|4/12/2023 6:57:09 PM - Gateway| GuildDownloader Stopped
| Server detected: Tankovy prapor
|4/12/2023 6:57:09 PM - Gateway| Ready
weird, it sees the dalai server.. what happens when you send a message in the discord and ping the bot?
I just noticed,
(I tried some queries and part of them go through)
it may be because all the servers are remote, cause i kinda dont have enough specs to run it all on my own
Stable Diffusion is hosted on google GPU labs thingy and Dalai LLaMA i found some random open to the public cause i dont have a server for it yet
haha I see - well as long as it works.
Well, it kinda works. None of the queries get transfered all the way, and it doesnt reply at all on discord
as long as you're getting data back that's all the bot can do - you'll have to find a server that generates faster or that isn't stopping your requests midway in favour of someone else's queries
Does it support other models than 7B ? I have a server in mind that could handle 30B but if it wont work either way it would be a waste
yep you bet it can. just need to alter my code in the program.cs file. the dalaiParameters section for dalai, or change your --model nodel-name-here in the bat file for oobabooga.
for dalai: just search the program.cs file for the code alpaca.7B and change that bit to alpaca.30B and it will automatically query dalai to search its 30B folder. note, dalai needs the file in place named correctly so you have to run the dalai alpaca install 30B command and have it download the file.
var dalaiRequest = new
{
seed = -1,
threads = 16,
n_predict = 200,
top_k = 40,
top_p = 0.9,
temp = 0.8,
repeat_last_n = 64,
repeat_penalty = 1.1,
debug = false,
model = "alpaca.7B", <----------- here change to 30B
prompt = inputPrompt
};
I changed all the required stuff and whener i try to query the bot it returns the following in the console APP
I have stable diffusion running on 127.0.0.1:7860